2017-09-26 102 views
1

我正在尋找一個二進制文件中的2字節序列,該文件太大而無法放入內存。我不能簡單地一次讀取2個字節,因爲例如讀取二進制文件:Python有一個unget()等價物嗎?

xx xx x1 2x xx 

同樣,我不能簡單地查找,然後再看看第二個是存在的,因爲

xx112xx 

我真的很希望能夠像做:

with open("myfile", "rb") as f: 
    byte = f.read(1) 
    while byte: 
     if byte == b'1': 
      if f.read(1) == b'2': 
       # success case 
      else: 
       # put back the latest byte somehow 
     byte = f.read(1) 

是否有一些功能可以完成這項前瞻性工作,而無需自己完成所有簿記細節?

回答

3

io.BufferedReader() object具有peek() method

返回從流而不前進位置字節。對原始流最多進行一次讀取以滿足呼叫。返回的字節數可能少於或多於請求的數量。

你得到這樣一個對象,只要你打開閱讀二進制模式文件,這樣你就可以直接在你的代碼中使用它:

with open("myfile", "rb") as f: 
    for byte in iter(lambda: f.read(1), b''): 
     if byte == b'1': 
      if f.peek(1) == b'2': 
       # success case 

要考慮到我們在偷看字節仍'在流中',下一個f.read()電話將包括它。如果你不想要的話,你必須發出一個明確的f.read(1)

我用iter() 2-argument call替換了while循環,以在for循環中一次讀取1個字節的文件。