11

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

本质上是一个字符串

Health\x00experience\x00charactername\x00

并将其存储在列表中。

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

4

4 回答 4

10

Python 不会将 NUL 字节视为任何特殊的东西。它们与空格或逗号没有什么不同。所以,split()工作正常:

>>> my_string = "Health\x00experience\x00charactername\x00"
>>> my_string.split('\x00')
['Health', 'experience', 'charactername', '']

请注意,它split\x00视为分隔符,而不是终止符,因此我们在末尾得到一个额外的空字符串。如果这是一个问题,你可以把它切掉:

>>> my_string.split('\x00')[:-1]
['Health', 'experience', 'charactername']
于 2013-09-24T00:04:50.097 回答
9

虽然归结为使用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'

然后你可以做类似的事情

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

这具有额外的好处,即在拆分文本之前不需要将整个内容加载到内存中。

于 2013-09-24T00:12:06.537 回答
3

要检查字符串是否有 NULL 字节,只需使用in运算符,例如:

if b'\x00' in data:

要找到它的位置,使用find()which 将返回找到子字符串 sub 的字符串中的最低索引。然后使用可选参数startend进行切片表示法。

于 2015-06-01T15:47:22.287 回答
1

拆分空字节;.split()返回一个列表:

>> print("Health\x00experience\x00charactername\x00".split("\x00"))
['Health', 'experience', 'charactername', '']

如果您知道数据总是以空字节结尾,则可以对列表进行切片以切掉最后一个空字符串(如result_list[:-1])。

于 2013-09-24T00:07:53.760 回答