2017-05-10 1 views
0

Ceci est une mission de Python pour tout le monde Chapitre 10 Affectation 10.2 dans laquelle le problème déclareMon programme ne lit pas correctement des lignes à partir d'un fichier séquentiel

écrire un programme pour lire la Mbox-short.txt et déterminer la distribution par heure du jour pour chacun des messages. Vous pouvez retirer l'heure de la ligne 'De' en trouvant l'heure, puis en la séparant une seconde fois en utilisant deux points. "De [email protected] Sam 5 Jan 09:14:16 2008" Une fois que vous avez accumulé les comptes pour chaque heure, imprimez les comptes, triés par heure comme indiqué ci-dessous.

La sortie souhaitée est

04 3 
06 1 
07 1 
09 2 
10 3 
11 6 
14 1 
15 2 
16 4 
17 2 
18 1 
19 1 

mon code est ici

`name = raw_input("Enter file:") 
if len(name) < 1 : name = "mbox-short.txt" 
handle = open(name) 
counts = dict() 

for line in handle: 
    line = line.rstrip() 
    if line.startswith("From "): 
     parts = line.split() 
#  print parts 
     time = parts[5] 
     pieces = time.split(':') 
     hour = pieces[0] 
     counts[hour] = counts.get(hour,0)+1 
print counts ` 

Le fichier texte peut être trouvé ici http://www.pythonlearn.com/code/mbox-short.txt Lorsque le débogage, j'ai réalisé que mon compilateur passe par chaque ligne de nombreux fois pour retourner des valeurs pour chaque heure qui est beaucoup trop élevé. Je suis sûr que la syntaxe line.startswith("From ") est correcte pour seulement lire les lignes prévues parce que j'ai utilisé dans une affectation précédente.

Comment puis-je obtenir la bonne fréquence pendant des heures?

+0

Sorted Il serait utile que vous montriez votre sortie réelle. – RobertB

+0

C'est un problème mixte d'onglets et d'espaces. Python ne voit pas votre indentation de la même manière que vous. Activez "afficher les espaces" dans votre éditeur pour voir le problème; votre éditeur peut également avoir une fonctionnalité "convertir les onglets en espaces" pour le réparer. Exécuter Python avec le drapeau '-tt' peut aider à attraper ces erreurs. – user2357112

+0

Merci, il semblait y avoir une erreur d'indentation. Activer cette option dans mon éditeur est un changement très utile pour l'écriture de code. Merci! – jboges

Répondre

0

votre code fonctionne bien comme je l'ai essayé.

pour la sortie, un dictionnaire n'est pas trié. vous pouvez utiliser sort (counts) qui renvoie une liste triée des clés. avec ceux-ci vous pouvez imprimer votre dict de manière

name = raw_input("Enter file:") 
if len(name) < 1 : name = "mbox-short.txt" 
handle = open(name) 
counts = dict() 

for line in handle: 
    line = line.rstrip() 
    if line.startswith("From "): 
     parts = line.split() 
     time = parts[5] 
     pieces = time.split(':') 
     hour = pieces[0] 
     counts[hour] = counts.get(hour,0)+1 

for key in sorted(counts): 
    print key + " " + str(counts[key]) 

sortie est

04 3 
06 1 
07 1 
09 2 
10 3 
11 6 
14 1 
15 2 
16 4 
17 2 
18 1 
19 1