从文本文件中读取并将文字频率保存到新文本文件中,然后在新行上打印每个文件

问题描述:

美好的一天。请帮助。使用的语言是python。下面的代码从一个文本文件中读取,然后将每个单词的频率返回到新行中。我是从这个网站https://rmtheis.wordpress.com/2012/09/26/count-word-frequency-with-python/从文本文件中读取并将文字频率保存到新文本文件中,然后在新行上打印每个文件

import re 
from collections import Counter 


def openfile(filename): 
    fh = open(filename, "r+") 
    str = fh.read() 
    fh.close() 
    return str 


def removegarbage(str): 
    # Replace one or more non-word (non-alphanumeric) chars with a space 
    str = re.sub(r'\W+', ' ', str) 
    str = str.lower() 
    return str 


def getwordbins(words): 
    cnt = Counter() 
    for word in words: 
     cnt[word] += 1 
    return cnt 


def main(filename, topwords): 
    txt = openfile(filename) 
    txt = removegarbage(txt) 
    words = txt.split(' ') 
    bins = getwordbins(words) 
    for key, value in bins.most_common(topwords): 

     print(key, value) 

main('hamlet.txt', 500) 

从上面的,它打印精美的IDE我使用(pyCharm)。但是,当我补充一点,上面的代码下面的下面的代码,

#Write to file 
    with open("newFile.txt", "w") as f: 
     for word in main('hamlet.txt', 500): 
      f.write(word + os.linesep) 

它打印在控制台不错,但显示了一些错误,也是它没写文本文件我创建在所有。 。下面是显示在控制台上的示例输出一个片段阅读的文本文件后,它打印:

the 16 
of 12 
to 9 
search 9 
which 6 

所以,现在,我希望写这上面的输出到纺织的文本文件。该内容要长得多比以上。谢谢。顺便说一句,误差在控制台上得到的是

Traceback (most recent call last): 
    File "/Users/test/PycharmProjects/Trial/trial.py", line 52, in <module> 
    for word in main("hamlet.txt", 500): 
TypeError: 'NoneType' object is not iterable 

,如果你想使用的功能main如图所示,即

for word in main('hamlet.txt', 500): 

那么函数应适应这一点。 人们可以使用例如发电机:

def main(filename, topwords): 
    txt = openfile(filename) 
    txt = removegarbage(txt) 
    words = txt.split(' ') 
    bins = getwordbins(words) 
    for key, value in bins.most_common(topwords): 
     # yield key #generate only the word, not it's frequency 
     yield key, value 

with open("newFile.txt", "w") as f: 
    for word, freq in main('hamlet.txt', 500): 
     f.write('%s\t%d\n' % (word, freq)) 
+0

谢谢你的答复。我尝试了你的建议。它确实节省了纺织品,但没有显示频率。但就像我之前说过的,结果必须保存在文本文件中,并且也保存在频率中。就像我上面显示的示例输出一样。所以请你怎么能帮助我呢?再次感谢... – user3761841

+0

@ user3761841在这种情况下,发生器可以产生两个值。这些被写入输出文件。我已经相应地更新了答案。 – ewcz

+0

'那就是诀窍....哇,非常感谢。 Python似乎有点奇怪,虽然..我来自Java背景... Thankssss很多..' – user3761841

您需要return key, value,而不是打印出来

+0

谢谢你的回应。我跟着你的指示,我没有改变任何东西,而不是从(返回键,价值)到(返回键,值),但我似乎甚至没有运行在这一次。它显示一个错误。 – user3761841

+0

有关TypeError的一些信息:不支持的操作数类型为+:'int'和'str' – user3761841

+0

我按照您的指示进行了尝试。它保存到纺织品中,但只保存了一个字,并且没有显示频率。我现在可以做什么?谢谢。 – user3761841