如何在write方法中使用for循环?

时间:2014-01-22 22:49:38

标签: python

程序应该读取给定的文件,用字典计算每个单词的出现次数,然后创建一个名为report.txt的文件并输出单词及其频率列表

infile = open('text file.txt','r')

dictionary = {}
# count words' frequency
for i in range(1,14):
    temp = infile.readline().strip().split()
    for item in temp:
        if dictionary.has_key(item) == False:
            dictionary[item] = 1
        elif dictionary.has_key:
            temp2 =  dictionary.get(item)
            dictionary[item] = temp2 + 1


infile.close()

outfile = open('report.txt','w')
outfile.write( for words in dictionary:
                   print '%15s :' %words, dictionary[words])

一切都在计数部分有效,但是 恰好在写输出的最后部分,我意识到我不能在写方法中放置for循环

3 个答案:

答案 0 :(得分:5)

您需要将write 放在 for循环中:

for words in dictionary:
    outfile.write('%15s : %s\n' % (words, dictionary[words]))

或者你可以使用理解,但他们有点忍者,可能更难阅读:

outfile.write('\n'.join(['%15s : %s' % key_value for key_value in dictionary.items()]))

答案 1 :(得分:1)

正如已接受的答案中已经说过的那样,您需要write循环内的for。但是,在使用文件时,最好在with上下文中执行操作,因为这会自动处理文件的关闭。 e.g。

with open('report.txt','w') as outfile: 
    for words in dictionary:
        outfile.write('%15s : %s\n' % (words, dictionary[words]))

答案 2 :(得分:0)

您的代码包含几个不足之处:

  • 您没有使用 has_key 而且您没有直接与 True / False 进行比较 - 这是多余的和坏的风格(任何语言)

    if dictionary.has_key(item) == False:

应该是

`if not item in dictionary`

值得一提的是,首先使用正面测试会更有效率 - 因为文件中大多数单词的出现次数可能超过1次

  • dictionary.has_key 返回对 has_key 方法的引用 - 其中布尔值等于True(您的代码意外工作,因为无论第一个条件是第二个是永远是真的)。简单的 else 就足够了

  • 条件中的最后两个语句可能只是重写为

    dictionary[item] += 1

那就是说,你可以使用collections.Counter来计算单词

dictionary = Counter()
for lines in source_file:
    dictionary.update(line.split())

(BTW,在拆分之前剥离是多余的)