2016-11-20 54 views
0

我有一個作業問題。我應該編寫一個名爲「WordsByLine」的函數,它應該計算文件中每行唯一字的頻率,並將唯一字的頻率打印到輸出文件中的相應行。我的教授告訴我們輸出應該是什麼樣子。例如,如果輸入的文本文件中說:如何獲取計數器以將輸入文本文件中每行的唯一字的頻率打印到輸出文本文件上的相應行上?

one fish two fish red fish blue fish

(一條魚兩條魚是第一行紅色的魚藍色的魚是第二行。)

輸出有看起來像這樣:

two:1 one:1 fish:2 red:1 blue:1 fish:2

在輸出的第一行是用於第一行的唯一字的頻率,然後對第二行相同。

這裏是我的代碼:

def wordsByLine(inFile, outFile): 
    from collections import Counter 
    outFile = open(outFile, 'w') 
    with open(inFile, 'r') as f: 
     freqs = Counter(f.readline().split()) 
    outFile.write(str(freqs)) 
    outFile.close() 
print(wordsByLine('input.txt','output.txt')) 

但這裏是我的文本文件輸出。只打印出第一行:

Counter({'two':1, 'one':1, 'fish':2})

我如何拿到專櫃去跳過線(在輸入文件從下一行)打印的獨特單詞頻率下一行?

+0

不要在函數內部導入。這幾乎不是一個好主意。 –

+1

兩個注意事項:1)你的任務是編寫一個函數來計算單詞*每行*:你的函數應該只在一行上工作,並打印出頻率。 2)你目前沒有循環遍歷文件的所有行,但你只讀了一行。 – sal

+0

每次你打開(outFile,'w')'它會創建一個新文件。你想'打開(outFile,'wa')'追加到任何現有的文件。只需打開一次文件並將每個連續的輸出行寫入即可。 – martineau

回答

0

正如評論中指出的那樣,您只讀過一行f.readline。此外,您可能要格式化文本,而不是打印出一個Counter對象的字符串表示:

>>> from collections import Counter 
>>> def words_by_line(infile, outfile): 
...  with open(infile) as f1, open(outfile, 'w') as f2: 
...   for line in f1: 
...    counts = Counter(line.split()) 
...    string_gen = ("{}:{}".format(k,v) for k,v in counts.items()) 
...    f2.write(" ".join(string_gen) + "\n") 
... 
>>> words_by_line('input.txt','output.txt') 

結果:

(trusty)[email protected]:~$ cat output.txt 
fish:2 two:1 one:1 
fish:2 red:1 blue:1 
(trusty)[email protected]:~$ 
+0

非常感謝你這是正確的答案,順便提一句,(可信)juan @ localhost:〜$ cat output.txt沒有出來。與(trusty)juan @ localhost:〜$相同。好東西這兩個垃圾沒有出來。但我現在很好! – Jorgan

相關問題