Подтвердить что ты не робот

Чтение текстового файла и разбиение его на отдельные слова в 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
...
4b9b3361

Ответ 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())