如何计算python中文件中的字频率

时间:2012-08-24 22:46:04

标签: python

我有一个.txt文件,格式如下,

C
V
EH
A
IRQ
C
C
H
IRG
V

虽然显然它比那要大得多,但实质上就是它。基本上我试图将每个字符串在文件中的次数相加(每个字母/字符串都在一个单独的行上,所以从技术上讲,文件是C \ nV \ nEH \ n等。但是当我尝试将这些文件转换为列表,然后使用count函数时,它会分出字母,以便'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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

s += line更改为s.extend(line.split())+=运算符用于将两个序列一起添加,字符串被视为一系列字符。您可以使用list.append(例如s.append(line))将整行添加为列表中的单个条目,也可以使用list.extend添加字符串列表。

在这种情况下,我使用line.split()将行拆分为单个单词,然后将单词列表添加到当前列表中。如果每一行只包含一个单词,那么您可以使用s.append(line)代替。

答案 2 :(得分:0)

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

为了便于使用这些旧版本,最好使用collections.defaultdict(int)