0
votes

Trouver la fréquence des mots ligne par ligne dans le fichier txt Python (comment formater correctement)

J'essaie de faire un programme simple qui peut trouver la fréquence des occurrences dans un fichier texte ligne par ligne. Je l'ai tout correctement, sauf lorsque plus d'un mot est sur une ligne dans le fichier texte. (Plus d'informations ci-dessous)

Le fichier texte ressemble à ceci:

file = open("test.txt", "r") 
text = file.read() #reads file (I've tried .realine() & .readlines()


word_list = text.split(None)
word_freq = {}  # Declares empty dictionary

for word in word_list:
    word_freq[word] = word_freq.get(word, 0) + 1
    keys = sorted(word_freq.keys())

for word in keys:
    final=word.capitalize()
    print(final + ': ' + str(word_freq[word])) # Line that prints the output

Je veux que la sortie soit: (ne doit pas être dans le même ordre)

Day: 2
Good: 3
Hello: 2
Hi: 2
Night: 1

Ce qu'il produit actuellement:

Hello: 2
Hi: 2
Good Day: 2
Good Night: 2

Mon code:

Hello
Hi
Hello
Good Day
Hi 
Good Day
Good Night


4 commentaires

Comment savez-vous que Good day est un mot et non deux? Si vous divisez votre texte en fonction d'espaces blancs, vous considérerez cela comme 2 mots ...


C'est ce que je demande


Alors ne vous séparez pas ...


Ensuite, vous devez diviser votre texte en fonction du caractère \n et non des espaces ... si votre texte contient toujours un caractère \n après chaque mot ....


4 Réponses :


0
votes

Vous souhaitez conserver les lignes. Ne vous divisez pas. Ne capitalisez pas. Ne triez pas

Utilisez un compteur

from collections import Counter

c = Counter() 
with open('test.txt') as f:
    for line in f:
        c[line.rstrip()] += 1

for k, v in c.items():
    print('{}: {}'.format(k, v))


6 commentaires

Y a-t-il un moyen sans modules?


Sûr. Mais est-ce une exigence? Vous devriez mettre à jour la question pour le dire


oui, comment pourrais-je afficher la sortie souhaitée comme indiqué ci-dessus


Ma réponse le fait déjà. As-tu essayé? Counter fait partie de la bibliothèque standard. Je n'installe aucun module


Je veux dire que je ne veux rien importer. donc sans importer Counter


Votre question n'indiquait pas que c'était une exigence. Je réponds juste à ce que tu voulais. Si c'est votre devoir, vous devez modifier la question pour clarifier cela



0
votes

Vous pouvez vous faciliter la tâche en utilisant un objet Counter. Si vous souhaitez compter les occurrences de lignes complètes, vous pouvez simplement faire:

counter_dict = {}
with open('file.txt') as f:
    l = f.readlines()
    for line in l:
        if line not in counter_dict:
            counter_dict[line] = 0
        counter_dict[line] +=1
print(counter_dict)

Éditer

Puisque vous avez demandé un moyen sans modules:

from collections import Counter
with open('file.txt') as f:
    c = Counter(f)
print(c)


2 commentaires

Et pas de modules?


Un objet fichier est itérable. Vous ne devriez pas avoir besoin de readlines dans le premier exemple



0
votes

Au lieu de diviser le texte par Aucun, divisez-le par chaque saut de ligne afin d'obtenir chaque ligne dans une liste.

file = open("test.txt", "r") 
text = file.read() #reads file (I've tried .realine() & .readlines()

word_list = text.split('\n')
word_freq = {}  # Declares empty dictionary

for word in word_list:
    word_freq[word] = word_freq.get(word, 0) + 1
    keys = sorted(word_freq.keys())

for word in keys:
    final=word.capitalize()
    print(final + ': ' + str(word_freq[word])) # Line that prints the output


0 commentaires

0
votes

Merci à tous pour les réponses, la plupart du code produit la sortie souhaitée de différentes manières. Le code que j'ai fini par utiliser sans module était le suivant:

from collections import Counter

c = Counter() 
with open('live.txt') as f:
    for line in f:
        c[line.rstrip()] += 1

for k, v in c.items():
    print('{}: {}'.format(k, v))

Le code que j'ai fini par utiliser avec les modules était le suivant:

file = open("test.txt", "r") 
text = file.read() #reads file (I've tried .realine() & .readlines()

word_list = text.split('\n')
word_freq = {}  # Declares empty dictionary

for word in word_list:
    word_freq[word] = word_freq.get(word, 0) + 1
    keys = sorted(word_freq.keys())

for word in keys:
    final=word.capitalize()
    print(final + ': ' + str(word_freq[word])) # Line that prints the output


0 commentaires