我正在尝试计算文件中的每个字符并将其放入字典中。 但它不太有效,我没有得到所有的角色。
#!/usr/bin/env python
import os,sys
def count_chars(p):
indx = {}
file = open(p)
current = 0
for ch in file.readlines():
c = ch[current:current+1]
if c in indx:
indx[c] = indx[c]+1
else:
indx[c] = 1
current+=1
print indx
if len(sys.argv) > 1:
for e in sys.argv[1:]:
print e, "contains:"
count_chars(e)
else:
print "[#] Usage: ./aufg2.py <filename>"
答案 0 :(得分:8)
假设您计算的文件合理地符合内存:
import collections
with open(p) as f:
indx = collections.Counter(f.read())
否则,您可以一点一点地阅读:
import collections
with open(p) as f:
indx = collections.Counter()
buffer = f.read(1024)
while buffer:
indx.update(buffer)
buffer = f.read(1024)
答案 1 :(得分:2)
主要问题是你只检查(最多!)每行一个字符。如果你是逐行读取文件,你需要有一个内部循环来迭代该行的字符。
#!/usr/bin/env python
import os, sys, collections
def count_chars(p):
indx = collections.Counter()
with open(p) as f:
for line in f:
for c in line:
indx[c] += 1
print indx
if len(sys.argv) > 1:
for e in sys.argv[1:]:
print e, "contains:"
count_chars(e)
else:
print "[#] Usage: ./aufg2.py <filename>"
答案 2 :(得分:1)
使用defaultdict。基本上,如果您尝试在defaultdict中获取一个不存在的项,它会创建该键并调用构造函数指定的第0个参数作为值。
import collections
def count_chars(p):
d = collections.defaultdict(int)
for letter in open(p).read():
d[letter] += 1
return d
答案 3 :(得分:1)
我已将此作为对@ Amber答案的评论发布,但会在此处重复...
要计算文件中字节的出现次数,然后生成一个小迭代器:
with open('file') as fin:
chars = iter(lambda: fin.read(1), '')
counts = Counter(chars)
这样来自fin
的底层缓冲仍然适用,但是你仍然更隐含的是你一次读取一个字节(而不是块大小,操作系统无论如何都会独立完成),它还允许在update
对象上不使用Counter
,实际上它变成了一个完整的,独立的指令。