2016-12-05 3 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 
Смежные вопросы