我有一个.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
答案 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.7
或3.1
,但是2.6
和3.0
没有collections.Counter
,那么Ashwini的回答是好的。
为了便于使用这些旧版本,最好使用collections.defaultdict(int)
。