Итерация по словам файла в Python - PullRequest
11 голосов
/ 12 октября 2011

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

Есть ли альтернативы?

Ответы [ 8 ]

6 голосов
/ 12 октября 2011

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

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

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

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

5 голосов
/ 12 октября 2011

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

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

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

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 голосов
/ 12 февраля 2014

Вы действительно должны рассмотреть возможность использования Генератора

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

with open('somefile') as f:
    word_gen(f)
2 голосов
/ 12 октября 2011

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

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

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

0 голосов
/ 30 ноября 2016

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

Вот мой полностью функциональный подход, который избегает необходимости читать и разделить линии. Используется модуль 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's soo very Functional!
It's
soo
very
Functional!
>>>

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

with open('words.txt', 'r') as f:
    for word in readwords(f):
        print(word)
0 голосов
/ 08 ноября 2015

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

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

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

0 голосов
/ 12 октября 2011

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

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

Alex.

0 голосов
/ 12 октября 2011

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

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

word_list = loaded_string.split()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...