计算文件中的每个字符

时间:2013-01-05 21:07:16

标签: python

我正在尝试计算文件中的每个字符并将其放入字典中。 但它不太有效,我没有得到所有的角色。

#!/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>"

4 个答案:

答案 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,实际上它变成了一个完整的,独立的指令。