2016-12-05 7 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 
関連する問題