1

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

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

4 回答 4

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)
于 2013-01-05T21:13:50.500 回答
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>"
于 2013-01-05T21:09:28.823 回答
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
于 2013-01-05T21:16:45.430 回答
1

我已将此作为对@Amber 答案的评论发布,但将在此处重复...

要计算文件中字节的出现次数,然后生成一个小迭代器:

with open('file') as fin:
    chars = iter(lambda: fin.read(1), '')
    counts = Counter(chars)

这样,底层缓冲fin仍然适用,但它仍然更加隐含,您一次读取一个字节(而不是块大小,无论如何操作系统都会自行执行),它也允许不使用updateon对象,Counter实际上变得更像是一个完整的、独立的指令。

于 2013-01-05T21:40:32.833 回答