Lire un fichier texte et le diviser en mots simples en python

j'ai Donc ce fichier texte composé de chiffres et de mots, par exemple, comme ceci - 09807754 18 n 03 aristocrat 0 blue_blood 0 patrician et je tiens à le diviser, de sorte que chaque mot ou le nombre viendra comme une nouvelle ligne.

un séparateur d'espace serait idéal car je voudrais que les mots avec les tirets restent connectés.

c'est Ce que j'ai jusqu'à présent:

f = open('words.txt', 'r')

for word in f:

    print(word)

pas vraiment comment aller à partir d'ici, je voudrais que cela soit le résultat:

09807754
18
n
3
aristocrat
...
36
demandé sur nalzok 2013-06-04 19:50:32

5 réponses

si vous n'avez pas de guillemets autour de vos données et que vous voulez juste un mot à la fois (en ignorant la signification des espaces vs les ruptures de ligne dans le fichier):

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

Si vous voulez une liste imbriquée des mots de chaque ligne du fichier (par exemple, pour créer une matrice de lignes et de colonnes à partir d'un fichier):

with open("words.txt") as f:
    [line.split() for line in f]

Ou, Si vous voulez aplatir le fichier dans un seul plat de la liste de mots dans le fichier, vous pourriez faire quelque chose comme ceci:

with open('words.txt') as f:
    [word for line in f for word in line.split()]

si vous voulez un regex solution:

import re
with open("words.txt") as f:
    for line in f:
        for word in re.findall(r'\w+', line):
            # word by word

Ou, si vous voulez qu'une ligne par ligne de générateur avec une regex:

 with open("words.txt") as f:
     (word for line in f for word in re.findall(r'\w+', line))
91
répondu dawg 2018-05-24 14:22:19
f = open('words.txt')
for word in f.read().split():
    print(word)
15
répondu dugres 2014-07-13 08:59:16

comme complément, si vous lisez un VVV très grand fichier, et vous ne voulez pas lire tout le contenu dans la mémoire à la fois, vous pourriez envisager d'utiliser un tampon, puis retourner chaque mot par rendement:

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)
9
répondu pambda 2017-05-25 19:41:26

Ce que vous pouvez faire est d'utiliser nltk pour marquer des mots, puis de stocker tous les mots dans une liste, voici ce que j'ai fait. Si vous ne connaissez pas nltk, il signifie natural language toolkit et est utilisé pour traiter le langage naturel. Voici quelques ressources si vous voulez commencer [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)

La sortie sera:

09807754
18
n
03
aristocrat
0
blue_blood
0
patrician
1
répondu Gaurav 2018-03-24 11:37:18

Voici mon approche totalement fonctionnelle qui évite d'avoir à lire et diviser les lignes. Il rend l'utilisation de l' itertools module:

Note pour python 3, Remplacer itertools.imapmap

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)

Exemple d'utilisation:

>>> 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!
>>>

je suppose que dans votre cas, ce serait le moyen d'utiliser la fonction:

with open('words.txt', 'r') as f:
    for word in readwords(f):
        print(word)
0
répondu smac89 2016-11-29 05:56:07