Моя программа неправильно читает строки из файла последовательно

Это задание из задания 10.2 главы 10 Python для всех, в котором говорится о проблеме.

Напишите программу, которая читает mbox-short.txt и вычисляет распределение по часам дня для каждого из сообщений. Вы можете вытащить час из строки «От», найдя время, а затем разделив строку во второй раз, используя двоеточие. «От человека @example.com, сб, 5 января, 09:14:16 2008». После того, как вы подсчитали количество за каждый час, распечатайте количество, отсортированное по часам, как показано ниже.

Желаемый результат

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

мой код здесь

`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 `

Текстовый файл можно найти здесь http://www.pythonlearn.com/code/mbox-short.txt При отладке я понял, что мой компилятор просматривает каждую строку много раз, возвращая слишком высокие значения за каждый час. Я уверен, что синтаксис line.startswith("From ") верен только для чтения намеченных строк, потому что я использовал его в предыдущем задании.

Как я могу получить правильную частоту для часов?


person jboges    schedule 10.05.2017    source источник
comment
Было бы полезно, если бы вы показали свой фактический результат.   -  person RobertB    schedule 11.05.2017
comment
Это проблема смешанных вкладок и пробелов. Python не видит ваш отступ так же, как вы. Включите отображение пробелов в вашем редакторе, чтобы увидеть проблему; ваш редактор также может иметь функцию преобразования табуляции в пробелы, чтобы исправить это. Запуск Python с флагом -tt может помочь отловить эти ошибки.   -  person user2357112 supports Monica    schedule 11.05.2017
comment
Спасибо, похоже, это ошибка отступа. Включение этой опции в моем редакторе — действительно полезное изменение для написания кода. Спасибо!   -  person jboges    schedule 11.05.2017
comment
Небольшой совет по мере того, как вы растете в питоне: читайте о коллекциях; collections.defaultdict - это мой goto, но я думаю, что есть также один, специально разработанный для вашего варианта использования (счетчик?) ... в частности, вы можете сделать counts[hour] += 1 и не беспокоиться о том, имеет ли counts час в качестве ключа, если считает, например defaultdict(целое)   -  person Foon    schedule 11.05.2017


Ответы (1)


ваш код работает нормально, как я пробовал.

для вывода словарь несортирован. вы можете использовать sort(counts), которая возвращает отсортированный список ключей. с ними вы можете распечатать свой дикт в отсортированном виде

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])

выход

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