Итерации через слова файла в Python

Мне нужно перебирать слова большого файла, состоящего из одной длинной длинной строки. Я знаю методы, которые повторяются через файл по строкам, однако они не применимы в моем случае из-за его структуры с одной строкой.

Любые альтернативы?

Ответ 1

Это зависит от вашего определения слова. Но попробуйте следующее:

f = file("your-filename-here").read()
for word in f.split():
    # do something with word
    print word

Это будет использовать пробельные символы в качестве границ слов.

Конечно, не забудьте правильно открыть и закрыть файл, это просто быстрый пример.

Ответ 2

Длинная длинная линия? Я предполагаю, что линия слишком велика, чтобы разумно поместиться в памяти, поэтому вы хотите какую-то буферизацию.

Прежде всего, это плохой формат; если у вас есть какой-либо контроль над файлом, сделайте это по одному слову в строке.

Если нет, используйте что-то вроде:

line = ''
while True:
    word, space, line = line.partition(' ')
    if space:
        # A word was found
        yield word
    else:
        # A word was not found; read a chunk of data from file
        next_chunk = input_file.read(1000)
        if next_chunk:
            # Add the chunk to our line
            line = word + next_chunk
        else:
            # No more data; yield the last word and return
            yield word.rstrip('\n')
            return

Ответ 3

Вам действительно стоит использовать Generator

def word_gen(file):
    for line in file:
        for word in line.split():
            yield word

with open('somefile') as f:
    word_gen(f)

Ответ 4

Есть более эффективные способы сделать это, но синтаксически это может быть кратчайшим:

 words = open('myfile').read().split()

Если память вызывает беспокойство, вы не захотите этого делать, потому что она будет загружать всю вещь в память, а не итерировать ее.

Ответ 5

Прочитайте в строке как обычно, затем разделите ее на пробел, чтобы разбить ее на слова?

Что-то вроде:

word_list = loaded_string.split()

Ответ 6

После прочтения строки вы можете сделать:

l = len(pattern)
i = 0
while True:
    i = str.find(pattern, i)
    if i == -1:
        break
    print str[i:i+l] # or do whatever
    i += l

Алекс.

Ответ 7

Что предложил Дональд Майнер, выглядит хорошо. Простой и короткий. Я использовал ниже в коде, который я написал некоторое время назад:

l = []
f = open("filename.txt", "rU")
for line in f:
    for word in line.split()
        l.append(word)

более длинная версия того, что предложил Дональд Майнер.

Ответ 8

Я ответил на аналогичный вопрос до, но я уточнил метод, используемый в этом ответе, и вот обновленная версия (скопирована из недавнего ответ):

Вот мой полностью функциональный подход, который позволяет избежать необходимости читать и разделенные линии. Он использует модуль itertools:

Примечание для python 3, замените itertools.imap на map

import itertools

def readwords(mfile):
    byte_stream = itertools.groupby(
      itertools.takewhile(lambda c: bool(c),
          itertools.imap(mfile.read,
              itertools.repeat(1))), str.isspace)

    return ("".join(group) for pred, group in byte_stream if not pred)

Использование образца:

>>> import sys
>>> for w in readwords(sys.stdin):
...     print (w)
... 
I really love this new method of reading words in python
I
really
love
this
new
method
of
reading
words
in
python

It soo very Functional!
It's
soo
very
Functional!
>>>

Я думаю, в вашем случае это будет способ использования функции:

with open('words.txt', 'r') as f:
    for word in readwords(f):
        print(word)