Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python中查找字符串中的空字节?_Python_String_List_Null_Byte - Fatal编程技术网

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

如何在Python中查找字符串中的空字节?,python,string,list,null,byte,Python,String,List,Null,Byte,我在读取文件后解析数据时遇到问题。我正在做的是在中读取一个二进制文件,需要从读取的文件中创建一个属性列表。文件中的所有数据都以空字节终止。我要做的是找到以空字节结尾的属性的每个实例 基本上是用一个字符串 Health\x00experience\x00charactername\x00 并将其存储在列表中 真正的问题是我需要保留空字节,我只需要能够找到空字节的每个实例并存储它前面的数据 Python不把NUL字节视为任何特殊的东西;它们与空格或逗号没有区别。因此,这很好: >>&g

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

基本上是用一个字符串

Health\x00experience\x00charactername\x00
并将其存储在列表中


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

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']

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

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

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

而归根结底,使用
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)]

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

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

if b'\x00' in data:

要查找它的位置,请使用which,它将返回找到子字符串sub的字符串中的最低索引。然后为切片表示法使用可选参数start和end。

我忘记在我的初始问题中说我需要保留所有的空字节,我只需要能够获取输入并找到空字节,抱歉,我没有澄清这一点initially@user2806298:正如刚才所暗示的,Python的
str.split
方法没有任何方法来保留分隔符,但是很容易将它们重新添加到每个分隔符上。例如:
[s+'\x00'代表我的字符串中的s.split('\x00')[:-1]]
。是的,错误中出现了额外的斜杠,我忘了在我的初始问题中说,我需要保留所有的空字节,我只需要能够获取输入并找到空字节,抱歉,我没有最初澄清这一点感谢您的帮助,问题是我忘记了在我的第一个问题中说我需要保留所有的空字节,我只需要能够获取输入并找到空字节,对不起,我没有澄清这一点initially@user2806298编辑以保留空字节