web-dev-qa-db-fra.com

Lire un fichier texte et le diviser en un seul mot 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 souhaite le scinder de manière à ce que chaque mot ou numéro apparaisse comme une nouvelle ligne. 

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

C'est ce que j'ai jusqu'ici: 

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

for Word in f:

    print(Word)

je ne sais pas trop comment partir d'ici, j'aimerais que ce soit la sortie:

09807754
18
n
3
aristocrat
...
40
Johnnerz

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 et des sauts de ligne du fichier):

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

Si vous souhaitez une liste imbriquée de mots dans 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 souhaitez aplatir le fichier dans une liste simple de mots du fichier, vous pouvez procéder de la manière suivante:

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

Si vous voulez une solution regex:

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 que cela soit un générateur ligne par ligne avec une expression rationnelle:

 with open("words.txt") as f:
     (Word for line in f for Word in re.findall(r'\w+', line))
100
dawg
f = open('words.txt')
for Word in f.read().split():
    print(Word)
17
dugres

En complément, Si vous lisez un fichier très volumineux et que vous ne voulez pas lire tout le contenu en mémoire en une fois, vous pouvez envisager d’utiliser un buffer , puis renvoyer 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 __== "__main__":
    for Word in read_words('./very_large_file.txt'):
        process(Word)
9
pambda

Ce que vous pouvez faire est d’utiliser nltk pour convertir des mots en mots, puis de stocker tous les mots dans une liste, voici ce que j’ai fait… .. Si vous ne connaissez pas nltk; il représente la boîte à outils en langage naturel 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 la suivante:

09807754
18
n
03
aristocrat
0
blue_blood
0
patrician
3
Gaurav
with open(filename) as file:
    words = file.read().split()

C'est une liste de tous les mots de votre fichier.

import re
with open(filename) as file:
    words = re.findall(r"([a-zA-Z\-]+)", file.read())
0
mujad

Voici mon approche totalement fonctionnelle qui évite d'avoir à lire et à fendre des lignes. Il utilise le module itertools :

Remarque pour Python 3, remplacez itertools.imap par 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)

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
smac89