2013-09-23 70 views
3

我在閱讀文件後遇到問題解析數據。我正在做的是讀入一個二進制文件,並且需要從讀文件創建一個屬性列表,文件中的所有數據都以空字節結束。我想要做的是找到空字節終止屬性的每個實例。如何在Python中的字符串中找到空字節?

基本上採取的字符串,如:

Health\x00experience\x00charactername\x00 

並將其存儲在列表中。

真正的問題是我需要保持空字節的完整性,我只需要能夠找到空字節的每個實例並存儲它之前的數據。

+1

請注意,在字符串中間是否真的存在'\ c',或者只是一個錯字? (在Python文字中,'\ c''和''\\ c''表示同樣的東西;在大多數其他語言中,這不是真的......) – abarnert

+0

是的,這是一個錯字,糾正了它的問題。 – user2806298

回答

2

雖然歸結爲使用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)] 

這具有不需要分裂文本前的全部內容加載到內存中的額外的好處。

+0

感謝您的幫助,但我的問題是我忘了說在我的第一個問題,我需要保持所有的空字節到位,我只需要能夠採取輸入,並找到空字節,對不起,我沒有澄清,最初 – user2806298

+0

你可以只添加nullbyte回來,對吧? – justhalf

+0

@ user2806298編輯以保留空字節到位 – kalhartt

3

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

我忘記說在我最初的問題,我需要保持所有的空字節到位,我只需要能夠接受輸入並找到空字節,對不起,我沒有澄清,最初 – user2806298

+0

你可以只添加空字節回來吧? – justhalf

+0

@ user2806298:正如justhalf所暗示的,Python的'str.split'方法沒有任何方法來保持分隔符,但很容易將它們添加回每個分隔符。例如:'[s +'\ x00'for s in my_string.split('\ x00')[: - 1]]'。 – abarnert

0

分割空字節; .split()返回一個列表:

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

如果您知道數據總是以空字節結束,你可以切片名單砍掉最後一個空字符串(如result_list[:-1])。

輸出中的奇數'...\\ch...是由於您輸入的字符串中的\char...\c是一個轉義碼。我認爲這只是你粘貼示例時的一個問題。

+0

呀存在額外的斜線錯誤 \t \t 我忘了我最初的問題說,我需要保持全部到位的nullbyte的,我只需要能夠採取的輸入,並找到nullbyte,對不起,我沒首先澄清, – user2806298

+0

你可以只添加nullbyte,對吧? – justhalf

+0

@ user2806298,然後請編輯您的問題**顯示**正是你想看到你給的例子輸入。試圖用英語解釋它是行不通的;-) –

0

要檢查是否字符串具有空字節,只需使用in運營商,例如:

if b'\x00' in data: 

要找到它的位置,使用find()這將在那裏子子發現返回字符串中指數最低。然後使用可選參數開始結束切片符號。

相關問題