2017-05-10 4 views
0

これは、問題は私のプログラムが正しく順次ファイルから行を読んでいません

を述べている皆章10割り当て10.2用のPythonからの割り当てでのmbox-short.txt一読するプログラムを書き、各メッセージの1日の時間別分布を把握する。 'From'行から時間を見つけ、コロンを使用して文字列をもう一度分割することで、時間を引き出すことができます。 "from [email protected]土1月5日09:14:16 2008年" 1時間ごとにカウントを集計したら、下に示すように時間単位でカウントをプリントアウトします。

所望の出力は、デバッグ、私は私のコンパイラは、多くの各ラインを通過することに気づいた場合、テキストファイルはここにhttp://www.pythonlearn.com/code/mbox-short.txt 見つけることができ、ここで

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

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

私のコードです時間がそれほど高い時間ごとの値を返します。以前の割り当てで使用したので、構文line.startswith("From ")は目的の行だけを読むために正しいと確信しています。

時間数を正しく取得するにはどうすればよいですか?

+0

です。 – RobertB

+0

これはタブとスペースの混在問題です。 Pythonはあなたと同じ方法でインデントを表示しません。エディタで「空白を表示」をオンにして問題を確認します。あなたのエディタには、「タブをスペースに変換する」機能があります。 '-tt'フラグを付けてPythonを実行すると、これらのエラーをキャッチできます。 – user2357112

+0

インデントエラーのようです。私のエディタでそのオプションを有効にすることは、コードを書く上で本当に役に立つ変更です。ありがとう! – jboges

答えて

0

私はそれを試したようにコードは正常に動作します。

出力の場合、辞書はソートされません。 ソート(カウント)を使用すると、ソートされたキーのリストを返すことができます。これらを使用すると、ソートされた方法であなたの辞書を印刷することができ

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 
関連する問題