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

2024-04-26 00:15:11 发布

您现在位置:Python中文网/ 问答频道 /正文

读取文件后解析数据时出现问题。我要做的是在中读取一个二进制文件,并需要从读取的文件中创建一个属性列表文件中的所有数据都以空字节结束。我要做的是查找以空字节结尾的属性的每个实例。

基本上是像

Health\x00experience\x00charactername\x00

并将其存储在列表中。

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


Tags: 文件数据实例列表字节属性结尾二进制
3条回答

虽然它可以归结为使用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)]

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

Python不把NUL字节当作任何特殊的东西;它们与空格或逗号没有区别。所以,^{}工作得很好:

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

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

>>> my_string.split('\x00')[:-1]
['Health', 'experience', 'charactername']

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

if b'\x00' in data:

要找到它的位置,请使用^{},它将返回找到sub string sub的字符串中的最低索引。然后使用可选参数startend表示切片。

相关问题 更多 >