1

img というファイルがあり、ジェネレーターを介して一度に 1 バイトずつ読み取ってファイルを 14xx バイトのチャンクに分割し、それらを変数に結合しようとすると、結果の変数が 14xx バイトではないのはなぜですか? Pythonの変数の内部処理のためですか?もしそうなら、create_data関数が別の指標を返す以外に、実際に14xxデータがあるかどうかをテストする方法は何ですか?

def split_file(self, filename):
    with open(filename, "rb") as f:
        while True:
            byte = f.read(1)
            if not byte:
                break
            yield(byte)


def create_data(self):
    for x in range (1, 1472):
        next_byte = split_file.filename

        if not next_byte :
            break
        else: 
            msg = msg + split_file(self.filename)
    return msg

curr_data = self.create_data
    while sys.getsizeof(curr_data) == 1472: 
        # do something with curr_data

前もって感謝します

4

3 に答える 3

2

あなたがしたいlen()、ではありませんsys.getsizeof()sys.getsizeof()Python オブジェクトのオーバーヘッドが含まれます。また、リストなどのコンテナーで "奇妙な" 動作 (つまり、おそらく予期しない) が発生することにも気付くでしょう。コンテナーによって使用されるメモリはカウントされますが、その中のオブジェクトによってはカウントされません。

于 2013-10-27T18:03:01.360 に答える
1

必要なサイズのファイル チャンクを実際に読み取るジェネレータを使用することもできます。

def split_file(self, filename, size=1472):
    with open(filename, "rb") as f:
        while True:
            buf= f.read(size)
            if not buf:
                break
            yield(buf)

このようにすれば、現在持っているへの 1472 回の呼び出しsplit_fileと 1472 回の文字列の追加を行う必要はありません。create_data

次に、次のことができます。

for chunk in split_file(self.filename, self.size):
    # if you want to discard the last chunk if len is less than size:
    if len(chunk)<self.size:
        break

    #otherwise, deal with a chunk:
    ...
于 2013-10-27T19:42:14.827 に答える
0

このような状況では、 という関数を使用するだけでsuper_len、すべてで機能します。リクエストのutils.pyファイルから取得します。

def super_len(o):
    if hasattr(o, '__len__'):
        return len(o)

    if hasattr(o, 'len'):
        return o.len

    if hasattr(o, 'fileno'):
        try:
            fileno = o.fileno()
        except io.UnsupportedOperation:
            pass
        else:
            return os.fstat(fileno).st_size

    if hasattr(o, 'getvalue'):
        # e.g. BytesIO, cStringIO.StringI
        return len(o.getvalue())

lenkindall が述べているように、代わりにを使用する必要がありますsys.getsizeofsuper_len私が遭遇したすべてのケースで動作します。

于 2013-10-27T18:09:31.767 に答える