如何在Python中的字符串中找到空字节?

use*_*298 7 python string null byte list

我在读取文件后解析数据时遇到问题.我正在做的是读取二进制文件并需要从读取文件创建属性列表文件中的所有数据都以空字节终止.我要做的是找到空字节终止属性的每个实例.

基本上像一个字符串

Health\x00experience\x00charactername\x00
Run Code Online (Sandbox Code Playgroud)

并将其存储在列表中.

真正的问题是我需要保持空字节,我只需要能够找到空字节的每个实例并存储它之前的数据.

aba*_*ert 7

Python不会将NUL字节视为特殊内容; 它们与空格或逗号没什么区别.所以,split()工作正常:

>>> my_string = "Health\x00experience\x00charactername\x00"
>>> my_string.split('\x00')
['Health', 'experience', 'charactername', '']
Run Code Online (Sandbox Code Playgroud)

请注意,split将其\x00视为分隔符,而不是终结符,因此我们最后会得到一个额外的空字符串.如果这是一个问题,你可以把它切掉:

>>> my_string.split('\x00')[:-1]
['Health', 'experience', 'charactername']
Run Code Online (Sandbox Code Playgroud)


kal*_*rtt 6

归结为使用split('\x00')便利包装可能会很好。

def readlines(f, bufsize):
    buf = ""
    data = True
    while data:
        data = f.read(bufsize)
        buf += data
        lines = buf.split('\x00')
        buf = lines.pop()
        for line in lines:
            yield line + '\x00'
    yield buf + '\x00'
Run Code Online (Sandbox Code Playgroud)

那么你可以做类似的事情

with open('myfile', 'rb') as f:
    mylist = [item for item in readlines(f, 524288)]
Run Code Online (Sandbox Code Playgroud)

这样做还有一个好处,就是不需要在拆分文本之前将整个内容加载到内存中。