2016-12-05 34 views
0

我有一個非常大的文件,我想閱讀並執行一些操作。根據我的代碼,我已經分配了1024個字節來讀取,然後循環直到讀取所有內容。但有時候這樣做會導致我的單詞被截斷。讀取文件而不截取單詞

即使當我提到一個大小閱讀我想確保它正在閱讀一個完整的單詞。我所有的話都是用空格分開的。

with open('test.txt', mode='r',encoding="utf-8") as f: 

      chunk_size = 1024 

      f_chunk = f.read(chunk_size) 

      while len(f_chunk)>0: 

       for word in f_chunk.split(): 
       #do something 
       print (word) 
       f_chunk = f.read(chunk_size) 

回答

2

我不知道是否有一個內置的方式,但你可以嘗試這樣的:

chunk_size = 1024 
data = '' 
while True: 
    data += f.read(chunk_size) 
    if not data: 
     break 
    last_sp = data.rfind(' ') 
    if last_sp == -1:    # No space at the end 
     last_sp = len(data) 
    block = data[:last_sp] 
    data = data[last_sp + 1:] 

    for word in block.split(): 
     print(word) 

基本上,你還記得最後一個塊的的下一個結束 - 如果你的單詞大於你的塊大小,這將不起作用,如果你有一個分隔符而不是一個空格(例如' '),則這可能不會起作用。

0

作爲一個替代方法,可以按如下方式創建一個字發生器:

def read_word(f): 
    word = [] 
    c = '.' 

    while c: 
     c = f.read(1) 

     if c.isalnum(): 
      word.append(c) 
     elif len(word): 
      yield ''.join(word) 
      word = [] 

    yield ''.join(word) 

with open('input.txt') as f_input: 
    for word in read_word(f_input): 
     print(word) 

這將返回整個單詞拆分基於是否有使用isalnum()字母數字字符。所以read_word()也刪除所有的空格。

例如,如果input.txt包含:

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Hoc loco tenere se Triarius non potuit. 

輸出將是:

Lorem 
ipsum 
dolor 
sit 
amet 
consectetur 
adipiscing 
elit 
Hoc 
loco 
tenere 
se 
Triarius 
non 
potuit 
相關問題