Чтение текстового файла и разбиение его на отдельные слова в python
У меня есть этот текстовый файл, состоящий из цифр и слов, например, вот так - 09807754 18 n 03 aristocrat 0 blue_blood 0 patrician
и я хочу разделить его так, чтобы каждое слово или число 09807754 18 n 03 aristocrat 0 blue_blood 0 patrician
в виде новой строки.
Разделитель пробелов был бы идеальным, так как я хотел бы, чтобы слова с тире оставались связанными.
Это то, что я до сих пор:
f = open('words.txt', 'r')
for word in f:
print(word)
не совсем уверен, как идти отсюда, я хотел бы, чтобы это был вывод:
09807754
18
n
3
aristocrat
...
Ответы
Ответ 1
Если у вас нет кавычек вокруг ваших данных, и вы просто хотите одно слово за раз (игнорируя значение пробелов и разрывов строк в файле):
with open('words.txt','r') as f:
for line in f:
for word in line.split():
print(word)
Если вам нужен вложенный список слов в каждой строке файла (например, для создания матрицы строк и столбцов из файла):
with open("words.txt") as f:
[line.split() for line in f]
Или, если вы хотите объединить файл в один плоский список слов в файле, вы можете сделать что-то вроде этого:
with open('words.txt') as f:
[word for line in f for word in line.split()]
Если вы хотите найти регулярное выражение:
import re
with open("words.txt") as f:
for line in f:
for word in re.findall(r'\w+', line):
# word by word
Или, если вы хотите, чтобы это был построчный генератор с регулярным выражением:
with open("words.txt") as f:
(word for line in f for word in re.findall(r'\w+', line))
Ответ 2
f = open('words.txt')
for word in f.read().split():
print(word)
Ответ 3
В качестве дополнительного,
если вы читаете большой файл vvvvery, и вы не хотите сразу читать весь контент в памяти, вы можете использовать буфер, а затем вернуть каждое слово с помощью yield:
def read_words(inputfile):
with open(inputfile, 'r') as f:
while True:
buf = f.read(10240)
if not buf:
break
# make sure we end on a space (word boundary)
while not str.isspace(buf[-1]):
ch = f.read(1)
if not ch:
break
buf += ch
words = buf.split()
for word in words:
yield word
yield '' #handle the scene that the file is empty
if __name__ == "__main__":
for word in read_words('./very_large_file.txt'):
process(word)
Ответ 4
Что вы можете сделать, это использовать nltk для токенизации слов, а затем сохранить все слова в списке, вот что я сделал. Если вы не знаете, NLTK; он обозначает инструментарий естественного языка и используется для обработки естественного языка. Вот некоторый ресурс, если вы хотите начать [ http://www.nltk.org/book/]
import nltk
from nltk.tokenize import word_tokenize
file = open("abc.txt",newline='')
result = file.read()
words = word_tokenize(result)
for i in words:
print(i)
Выход будет таким:
09807754
18
n
03
aristocrat
0
blue_blood
0
patrician
Ответ 5
Вот мой полностью функциональный подход, который позволяет избегать чтения и разделения строк. Он использует модуль 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)
Ответ 6
with open(filename) as file:
words = file.read().split()
Это список всех слов в вашем файле.
import re
with open(filename) as file:
words = re.findall(r"([a-zA-Z\-]+)", file.read())