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

主な問題は、すべての行から (多くても!) 1 文字しか調べないことです。ファイルを 1 行ずつ読み取っている場合は、行の文字を反復処理する内部ループが必要です。

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

これを@Amberの回答へのコメントとして投稿しましたが、ここで繰り返します...

ファイル内のバイト数をカウントするには、小さな反復子を生成します。

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

このように、基になるバッファリングはfin引き続き適用されますが、一度に 1 バイトずつ読み取っていることはより暗黙的なままです (とにかく OS が独自に行うブロック サイズではなく)、updateonを使用しないこともできます。事実上、Counterより完全な独立した命令になります。

于 2013-01-05T21:40:32.833 に答える
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 に答える