Итерации через слова файла в 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)