我有一个字符串:
'BZh91AY&SYA\xaf\x82\r\x00\x00\x01\x01\x80\x02\xc0\x02\x00 \x00!\x9ah3M\x07<]\xc9\x14\xe1BA\x06\xbe\x084'
Run Code Online (Sandbox Code Playgroud)
而且我要:
b'BZh91AY&SYA\xaf\x82\r\x00\x00\x01\x01\x80\x02\xc0\x02\x00 \x00!\x9ah3M\x07<]\xc9\x14\xe1BA\x06\xbe\x084'
Run Code Online (Sandbox Code Playgroud)
但我不断得到:
b'BZh91AY&SYA\\xaf\\x82\\r\\x00\\x00\\x01\\x01\\x80\\x02\\xc0\\x02\\x00 \\x00!\\x9ah3M\\x07<]\\xc9\\x14\\xe1BA\\x06\\xbe\\x084'
Run Code Online (Sandbox Code Playgroud)
语境
我从网页上刮下一个字符串并将其存储在变量中un。现在我想用 BZip2 解压它:
bz2.decompress(un)
Run Code Online (Sandbox Code Playgroud)
但是,由于un是一个str对象,我收到此错误:
TypeError: a bytes-like object is required, not 'str'
Run Code Online (Sandbox Code Playgroud)
因此,我需要在un不将单个反斜杠更改为转义反斜杠的情况下转换为类似字节的对象。
编辑1: 感谢您的所有帮助!@wim 我现在明白你的意思了,但我不知道如何从我的网页抓取方法中检索一个类似字节的对象:
r = requests.get('http://www.pythonchallenge.com/pc/def/integrity.html')
doc = html.fromstring(r.content)
comment = doc.xpath('//comment()')[0].text.split('\n')[1:3]
pattern = re.compile("[a-z]{2}: '(.+)'")
un = re.search(pattern, comment[0]).group(1)
Run Code Online (Sandbox Code Playgroud)
该包是我使用的是requests,lxml.html,re,和bz2。
再次,我的目标是解压un使用bz2,但我有困难,从我webscraping过程中得到一个字节状物体。
任何指针?
我试图在 python 3.4 中使用的代码:
#!/usr/bin/python3
def get_mac_addr(ifname):
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
info = fcntl.ioctl(s.fileno(), 0x8927, struct.pack('256s', ifname[:15]))
return ''.join(['%02x:' % ord(char) for char in info[18:24]])[:-1]
print (get_mac_addr('eth0'))
Error: struct.error: argument for 's' must be a bytes object
Run Code Online (Sandbox Code Playgroud)
我看到这段代码在不使用 python3 时确实有效,但我的项目需要在 3 中使用它。我尝试与问题进行比较:Struct.Error, Must Be a Bytes Object? 但我不知道如何将其应用到自己身上。
org.apache.kafka.common.serialization.ByteArraySerializerKafka 的 Producer API 中有一个用于 Java 的类,还有一个org.apache.kafka.common.serialization.ByteArrayDeserializer用于 Consumer API 的类。
如果您在 Python 中使用 Kafka,是否有等效的类?
假设您有一个字符串:
mystring = "Welcome to the InterStar cafe, serving you since 2412!"
Run Code Online (Sandbox Code Playgroud)
我正在寻找一种将该字符串转换为数字的方法,例如:
encoded_string = number_encode(mystring)
print(encoded_string)
08713091353153848093820430298
Run Code Online (Sandbox Code Playgroud)
..您可以转换回原始字符串。
decoded_string = number_decode(encoded_string)
print(decoded_string)
"Welcome to the InterStar cafe, serving you since 2412!"
Run Code Online (Sandbox Code Playgroud)
它不必是加密安全的,但无论它在什么计算机上运行,它都必须为相同的字符串输出相同的数字。
在我的 python 代码中,我面临以下问题:
Traceback (most recent call last):
File "/tmp/mod_wsgi-localhost:5000:0/handler.wsgi", line 94, in <module>
recorder_directory=recorder_directory)
File "/usr/lib64/python3.6/site-packages/mod_wsgi/server/__init__.py", line 1400, in __init__
exec(code, self.module.__dict__)
File "/app/scripts/core.wsgi", line 1, in <module>
from core_nbi import core_ws as application
File "/app/core_if_nbi.py", line 357, in <module>
coreApi.start()
File "/app/core.py", line 250, in wrapper
return func(self, *args, **kwargs)
File "/app/core.py", line 646, in start
self.otkHandler.loadCertificate()
File "/app/core.py", line 294, in loadCertificate
default_backend())
File "/usr/lib64/python3.6/site-packages/cryptography/x509/base.py", line 50, in load_pem_x509_certificate
return backend.load_pem_x509_certificate(data)
File "/usr/lib64/python3.6/site-packages/cryptography/hazmat/backends/openssl/backend.py", line 1143, in load_pem_x509_certificate …Run Code Online (Sandbox Code Playgroud) import hmac
import hashlib
import base64
my = "/api/embedded_dashboard?data=%7B%22dashboard%22%3A7863%2C%22embed%22%3A%22v2%22%2C%22filters%22%3A%5B%7B%22name%22%3A%22Filter1%22%2C%22value%22%3A%22value1%22%7D%2C%7B%22name%22%3A%22Filter2%22%2C%22value%22%3A%221234%22%7D%5D%7D"
key = "e179017a-62b0-4996-8a38-e91aa9f1"
print(hashlib.sha256(my + key).hexdigest())
Run Code Online (Sandbox Code Playgroud)
我得到这个结果:
2df1d58a56198b2a9267a9955c31291cd454bdb3089a7c42f5d439bbacfb3b88
Run Code Online (Sandbox Code Playgroud)
预期结果:
adcb671e8e24572464c31e8f9ffc5f638ab302a0b673f72554d3cff96a692740
Run Code Online (Sandbox Code Playgroud) 自从我开始使用 Python 的第 3 版以来,我在通过套接字发送字符串时遇到了很多问题。我知道要在套接字中发送字符串,'b'必须在字符串之前放置a才能将其转换为字节。但是当我必须将 an 转换input()为字节时会发生什么?它是如何完成的?
我需要将键盘写入的消息发送到套接字:
import socket
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(("localhost",7500))
msg = input()
client.send(msg)
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试时,出现以下错误:
TypeError: a bytes-like object is required, not 'str'
Run Code Online (Sandbox Code Playgroud)
有人可以告诉我如何转换input()为字节吗?我总是使用 2.7 版本,我不明白为什么版本 3 对套接字的处理如此刺激。:(
我列出了一些网络分析的大量输出,列出了每行的边缘,这导致了几十GB,延长了我的资源限制(低估).因为我只处理数值,所以我想到我可能比使用Py3k默认值更聪明.即如果我只有数字(以及空格和偶尔的小数点),其他一些字符编码可能会为我节省相当多的空间.由于受到限制,我甚至可以保存在行结尾(不要将Windows标准CRLF复制).这方面的最佳做法是什么?
示例行将如下所示:
62233 242344 0.42442423
(实际上最后一个数字实际上是毫无意义的,我会将它切回三个非零数字.)
因为我需要在文本文件中读取其他软件(实际上是Stata),我不能将数据保存在任意二进制文件中,尽管我看不出为什么Stata只会读取UTF-8文本.或者你只是说避免使用UTF-8几乎不能为我节省任何费用?
我认为压缩对我来说不起作用,因为我逐行写文本,即使在此期间限制输出大小也是很好的.我可能很容易弄错压缩是如何工作的,但我认为它可以在文件生成后节省空间,但我的问题是我的代码崩溃已经因为我正在制作文本文件(逐行).
感谢所有想法和澄清问题!
给定一个随机字节(即不仅是数字/字符!),我需要将其转换为字符串,然后在不丢失信息的情况下返回初始字节。这似乎是一项基本任务,但我遇到了以下问题:
假设:
rnd_bytes = b'w\x12\x96\xb8'
len(rnd_bytes)
Run Code Online (Sandbox Code Playgroud)
印刷: 4
现在,将其转换为字符串。注意:我需要设置backslashreplace,否则它会返回“UnicodeDecodeError”,否则会丢失将其设置为另一个标志值的信息。
my_str = rnd_bytes.decode('utf-8' , 'backslashreplace')
Run Code Online (Sandbox Code Playgroud)
现在,我有了字符串。我想将它转换回原来的字节(大小为 4!):
根据 python 资源和这个答案,有不同的可能性:
conv_bytes = bytes(my_str, 'utf-8')
conv_bytes = my_str.encode('utf-8')
Run Code Online (Sandbox Code Playgroud)
但是 len(conv_bytes) 返回10.
我试着分析结果:
>>> repr(rnd_bytes)
"b'w\\x12\\x96\\xb8'"
>>> repr(my_str)
"'w\\x12\\\\x96\\\\xb8'"
>>> repr(conv_bytes)
"b'w\\x12\\\\x96\\\\xb8'"
Run Code Online (Sandbox Code Playgroud)
更换'\\\\'. my_str.replace('\\\\','\\')不会改变任何东西。可能是因为四个反斜杠只代表两个。所以,my_str.replace('\\','\')会找到'\\\\',但是会导致
语法错误:扫描字符串文字时 EOL
由于最后一个论点'\'。这已经在这里讨论过,其中提出了以下建议:
>>> my_str2=my_str.encode('utf_8').decode('unicode_escape')
>>> repr(my_str2)
"'w\\x12\\x96¸'"
Run Code Online (Sandbox Code Playgroud)
这取代了'\\\\'但似乎添加/更改了一些其他字符:
>>> conv_bytes2 = …Run Code Online (Sandbox Code Playgroud) 我下面的python代码适用于Python 2,
if header_written == False:
header = out_data.keys()
writer.writerow(out_data.keys()) # write headers
header_written = True
Run Code Online (Sandbox Code Playgroud)
writer.writerow(out_data.values()) #write rows
del out_data #del object
del row_data #del dict object
Run Code Online (Sandbox Code Playgroud)
但是在Python 3中,它返回以下错误:
TypeError:需要一个类似字节的对象,而不是'str'
python ×7
python-3.x ×7
apache-kafka ×1
byte ×1
bz2 ×1
certificate ×1
cryptography ×1
hmac ×1
io ×1
lxml ×1
lxml.html ×1
networking ×1
oauth ×1
pem ×1
performance ×1
sha256 ×1
string ×1
types ×1
x509 ×1