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
...
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))
f = open('words.txt')
for word in f.read().split():
print(word)
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)
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
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.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)
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)