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
...
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))
f = open('words.txt')
for Word in f.read().split():
print(Word)
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)
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
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())
Voici mon approche totalement fonctionnelle qui évite d'avoir à lire et à fendre des lignes. Il utilise le module itertools
:
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)