Comment renvoyer tous les mots uniques d'un fichier texte à l'aide de Python? Par exemple:
Je ne suis pas un robot
Je suis un humain
Devrait retourner:
Je
un m
ne pas
une
robot
humain
Voici ce que j'ai fait jusqu'à présent:
def unique_file(input_filename, output_filename):
input_file = open(input_filename, 'r')
file_contents = input_file.read()
input_file.close()
Word_list = file_contents.split()
file = open(output_filename, 'w')
for Word in Word_list:
if Word not in Word_list:
file.write(str(Word) + "\n")
file.close()
Le fichier texte créé par Python ne contient rien. Je ne suis pas sûr de ce que je fais mal
for Word in Word_list:
if Word not in Word_list:
chaque Word
est en Word_list
, par définition à partir de la première ligne.
Au lieu de cette logique, utilisez un set
:
unique_words = set(Word_list)
for Word in unique_words:
file.write(str(Word) + "\n")
set
s ne compte que des membres uniques, ce que vous essayez d’atteindre.
Notez que l'ordre ne sera pas conservé, mais vous ne préciserez pas s'il s'agit d'une exigence.
Il vous suffit de parcourir les lignes du fichier et d'utiliser set pour ne conserver que les uniques.
from itertools import chain
def unique_words(lines):
return set(chain(*(line.split() for line in lines if line)))
Procédez ensuite comme suit pour lire toutes les lignes uniques d’un fichier et les imprimer.
with open(filename, 'r') as f:
print(unique_words(f))
Cela semble être une application typique pour une collection:
...
import collections
d = collections.OrderedDict()
for Word in wordlist: d[Word] = None
# use this if you also want to count the words:
# for Word in wordlist: d[Word] = d.get(Word, 0) + 1
for k in d.keys(): print k
Vous pouvez également utiliser une collection.Counter (), qui comptera également les éléments que vous alimentez. L'ordre des mots serait perdu. J'ai ajouté une ligne pour compter et garder la commande.
string = "I am not a robot\n I am a human"
list_str = string.split()
print list(set(list_str))
def unique_file(input_filename, output_filename):
input_file = open(input_filename, 'r')
file_contents = input_file.read()
input_file.close()
duplicates = []
Word_list = file_contents.split()
file = open(output_filename, 'w')
for Word in Word_list:
if Word not in duplicates:
duplicates.append(Word)
file.write(str(Word) + "\n")
file.close()
Ce code parcourt chaque mot. S'il ne figure pas dans une liste duplicates
, il ajoute le mot et l'écrit dans un fichier.
Utiliser Regex et Set:
import re
words = re.findall('\w+', text.lower())
uniq_words = set(words)
Une autre méthode consiste à créer un dict et à insérer les mots tels que des clés:
for i in range(len(doc)):
frase = doc[i].split(" ")
for palavra in frase:
if palavra not in dict_Word:
dict_Word[palavra] = 1
print dict_Word.keys()
Utilisez un ensemble. Vous n'avez rien d'importer à faire pour cela.
#Open the file
my_File = open(file_Name, 'r')
#Read the file
read_File = my_File.read()
#Split the words
words = read_File.split()
#Using a set will only save the unique words
unique_words = set(words)
#You can then print the set as a whole or loop through the set etc
for Word in unique_words:
print(Word)
Le problème avec votre code est Word_list a déjà tous les mots possibles du fichier d'entrée. Lorsque vous parcourez la boucle, vous vérifiez si un mot dans Word_list n’est pas présent. Donc ça va toujours être faux. Cela devrait fonctionner .. (Notez que cela préservera également l'ordre).
def unique_file(input_filename, output_filename):
z = []
with open(input_filename,'r') as fileIn, open(output_filename,'w') as fileOut:
for line in fileIn:
for Word in line.split():
if Word not in z:
z.append(Word)
fileOut.write(Word+'\n')