我在读取文件后解析数据时遇到问题。我正在做的是读取一个二进制文件,并且需要从读取的文件中创建一个属性列表,文件中的所有数据都以空字节终止。我要做的是找到空字节终止属性的每个实例。
本质上是一个字符串
Health\x00experience\x00charactername\x00
并将其存储在列表中。
真正的问题是我需要保持空字节完好无损,我只需要能够找到空字节的每个实例并存储它之前的数据。
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']
虽然归结为使用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)]
这具有额外的好处,即在拆分文本之前不需要将整个内容加载到内存中。
要检查字符串是否有 NULL 字节,只需使用in
运算符,例如:
if b'\x00' in data:
要找到它的位置,使用find()
which 将返回找到子字符串 sub 的字符串中的最低索引。然后使用可选参数start和end进行切片表示法。
拆分空字节;.split()
返回一个列表:
>> print("Health\x00experience\x00charactername\x00".split("\x00"))
['Health', 'experience', 'charactername', '']
如果您知道数据总是以空字节结尾,则可以对列表进行切片以切掉最后一个空字符串(如result_list[:-1]
)。