如何在Python中统计文件中单词出现的频率

3

I have a .txt file with the following format,

C
V
EH
A
IRQ
C
C
H
IRG
V

尽管显然它比这个大得多,但本质上就是这样。基本上我试图总结每个单独的字符串在文件中出现的次数(每个字母/字符串在单独的一行上,因此从技术上讲,文件是C\nV\nEH\n等)。但是,当我尝试将这些文件转换为列表,然后使用计数函数时,它会将字母分开,所以像“IRQ”这样的字符串变成了['\n'I','R','Q','\n'],因此当我计算时,我得到了每个单独字母的频率而不是字符串的频率。
以下是我目前编写的代码:
def countf():
    fh = open("C:/x.txt","r")
    fh2 = open("C:/y.txt","w")
    s = []
    for line in fh:
        s += line
    for x in s:
        fh2.write("{:<s} - {:<d}".format(x,s.count(x))

我想得到的输出文件应该类似于这样:
C  10
V  32
EH 7
A  1
IRQ  9
H 8

1
需要用Python完成吗?sort yourfile.txt | uniq -c将给出单词计数(您提到了C:\,因此似乎您在Windows上,sortuniq是标准的Unix命令,如果您安装cygwin或http://unxutils.sourceforge.net/,则可以获得它们)。 - John Carter
@therefromhere - 我认为OP想要单词计数。Python代码按照它的写法生成字母计数。sortuniq技术上会生成行计数。不确定这是否正确。 - D.Shawley
单词计数,其中一些单词恰好由一个字母组成,这是为了生物研究。至于在Python中完成它,那和R是我唯一熟悉的语言,而且说实话,我想在Python中解决这个问题。 - TheFoxx
@D.Shawley 对不起,我看错了 - 只喝了一杯咖啡><已删除我的评论。 - John Carter
@therefromhere - “word” 不一定是“英语单词”。对于原帖的作者来说,使用字符串可能更好。 - selllikesybok
3个回答

6
使用 Counter(),并使用strip()函数去除\n
from collections import Counter
with open('x.txt') as f1,open('y.txt','w') as f2:
    c=Counter(x.strip() for x in f1)
    for x in c:
        print x,c[x]   #do f2.write() here if you want to write them to f2

输出:

A 1
C 3
EH 1
IRQ 1
V 2
H 1
IRG 1

0
s += line 改为 s.extend(line.split())+= 运算符用于将两个序列相加,而字符串被视为字符序列。 您可以使用 list.append(例如,s.append(line))将整行作为单个条目添加到列表中,或者使用 list.extend 添加字符串列表。
在这种情况下,我使用 line.split() 将行拆分为单个单词,然后将单词列表添加到当前列表中。 如果每行只包含一个单词,则可以改用 s.append(line)

0

如果你使用的是Python 2.73.1,那么Ashwini的回答很好,但是2.63.0没有collections.Counter

为了在这些旧版本中实现可移植性,最好使用{{link1:collections.defaultdict(int)}}。


有一个 回溯版本collections.Counter,应该可以在2.5和2.6上运行。此外,这个答案可能应该是一条评论。 - Karl Knechtel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接