2012-07-05 47 views
1

我有一個奇怪的行爲,我不明白:文件讀出和重新解析

如果我打開我的文件,我發現我的字節,但只有一次在一個時間:

f = open('d:\BB.ki', "rb") 
f10 = re.findall(b'\x03\x00\x00\x10''(.*?)''\xF7\x00\xF0', f.read()) 
print f10 
['1BBBAAAABBBBAAAABBBBAAAABBBBAAAA\x00'] 

f = open('d:\BB.ki', "rb") 
f11 = re.findall(b'\x03\x00\x00\x11''(.*?)''\xF7\x00\xF0', f.read()) 
print f11 
['2AAABBBBAAAABBBBAAAA\x00'] 

如果我嘗試打開該文件並獲得severall字節,我只得到第一個1(F11爲空)

f = open('d:\BB.ki', "rb") 
f10 = re.findall(b'\x03\x00\x00\x10''(.*?)''\xF7\x00\xF0', f.read()) 
f11 = re.findall(b'\x03\x00\x00\x11''(.*?)''\xF7\x00\xF0', f.read()) 
print f10,f11 
['1BBBAAAABBBBAAAABBBBAAAABBBBAAAA\x00'] **[]** 

我可以用一個循環,或類似的東西?

感謝

+0

除了下面的答案,您總是可以執行'f.seek(0)'將文件流指針重置爲文件開頭,然後第二個'read()'將起作用:) – Tisho 2012-07-05 15:38:25

回答

0

f.read()消耗約佔整個文件。只會看到F10。

試試這也許吧。

for line in open('d:\BB.ki', "rb").readlines(): 
    f10 = re.findall(b'\x03\x00\x00\x10''(.*?)''\xF7\x00\xF0', line) 
    f11 = re.findall(b'\x03\x00\x00\x11''(.*?)''\xF7\x00\xF0', line) 
+0

Thx隊友我知道了 – Waraba 2012-07-05 13:38:23

1

在調用f.read()有沒有更多的字節可供讀取所以f.read()第二個呼叫將返回一個空字符串。存儲f.read(的結果),而不是讀兩次:

s = f.read() 
f10 = re.findall(b'\x03\x00\x00\x10''(.*?)''\xF7\x00\xF0', s) 
f11 = re.findall(b'\x03\x00\x00\x11''(.*?)''\xF7\x00\xF0', s) 

您可能還需要掃描的數據僅僅是一個時間,找兩個表達式:

matches = re.findall(b'\x03\x00\x00[\x10\x11]''(.*?)''\xF7\x00\xF0', s) 

如果你的文件包含字節'\x03\x00\x00\x10\x03\x00\x00\x11_\xF7\x00\xF0'您提出的方法會找到兩個重疊的匹配項(\x03\x00\x00\x11__),而單一掃描方法只能找到一個匹配項。

+0

太棒了!第一個解決方案就是我所需要的,THX :) – Waraba 2012-07-05 13:36:51