我在閱讀文件後遇到問題解析數據。我正在做的是讀入一個二進制文件,並且需要從讀文件創建一個屬性列表,文件中的所有數據都以空字節結束。我想要做的是找到空字節終止屬性的每個實例。如何在Python中的字符串中找到空字節?
基本上採取的字符串,如:
Health\x00experience\x00charactername\x00
並將其存儲在列表中。
真正的問題是我需要保持空字節的完整性,我只需要能夠找到空字節的每個實例並存儲它之前的數據。
我在閱讀文件後遇到問題解析數據。我正在做的是讀入一個二進制文件,並且需要從讀文件創建一個屬性列表,文件中的所有數據都以空字節結束。我想要做的是找到空字節終止屬性的每個實例。如何在Python中的字符串中找到空字節?
基本上採取的字符串,如:
Health\x00experience\x00charactername\x00
並將其存儲在列表中。
真正的問題是我需要保持空字節的完整性,我只需要能夠找到空字節的每個實例並存儲它之前的數據。
雖然歸結爲使用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)]
這具有不需要分裂文本前的全部內容加載到內存中的額外的好處。
感謝您的幫助,但我的問題是我忘了說在我的第一個問題,我需要保持所有的空字節到位,我只需要能夠採取輸入,並找到空字節,對不起,我沒有澄清,最初 – user2806298
你可以只添加nullbyte回來,對吧? – justhalf
@ user2806298編輯以保留空字節到位 – kalhartt
Python不會將NUL字節視爲任何特殊的東西;它們與空格或逗號沒有區別。所以,split
正常工作:
>>> my_string = "Health\x00experience\x00\charactername\x00"
>>> my_string.split('\x00')
['Health', 'experience', '\\charactername', '']
注意split
被處理\x00
爲分離,不是終止,所以我們得到在最後一個額外的空字符串。如果這是一個問題,您可以將其切片:
>>> my_string.split('\x00')[:-1]
['Health', 'experience', '\\charactername']
我忘記說在我最初的問題,我需要保持所有的空字節到位,我只需要能夠接受輸入並找到空字節,對不起,我沒有澄清,最初 – user2806298
你可以只添加空字節回來吧? – justhalf
@ user2806298:正如justhalf所暗示的,Python的'str.split'方法沒有任何方法來保持分隔符,但很容易將它們添加回每個分隔符。例如:'[s +'\ x00'for s in my_string.split('\ x00')[: - 1]]'。 – abarnert
分割空字節; .split()
返回一個列表:
>> print "Health\x00experience\x00\charactername\x00".split("\x00")
['Health', 'experience', '\\charactername', '']
如果您知道數據總是以空字節結束,你可以切片名單砍掉最後一個空字符串(如result_list[:-1]
)。
輸出中的奇數'...\\ch...
是由於您輸入的字符串中的\char...
。 \c
是一個轉義碼。我認爲這只是你粘貼示例時的一個問題。
呀存在額外的斜線錯誤 \t \t 我忘了我最初的問題說,我需要保持全部到位的nullbyte的,我只需要能夠採取的輸入,並找到nullbyte,對不起,我沒首先澄清, – user2806298
你可以只添加nullbyte,對吧? – justhalf
@ user2806298,然後請編輯您的問題**顯示**正是你想看到你給的例子輸入。試圖用英語解釋它是行不通的;-) –
要檢查是否字符串具有空字節,只需使用in
運營商,例如:
if b'\x00' in data:
要找到它的位置,使用find()
這將在那裏子子發現返回字符串中指數最低。然後使用可選參數開始和結束切片符號。
請注意,在字符串中間是否真的存在'\ c',或者只是一個錯字? (在Python文字中,'\ c''和''\\ c''表示同樣的東西;在大多數其他語言中,這不是真的......) – abarnert
是的,這是一個錯字,糾正了它的問題。 – user2806298