2016-11-20 44 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

相关问题