1

Pythonでバイナリデータファイルを開き、値を1つずつ構造体に読み戻すにはどうすればよいですかlong 。私は現在このようなものを持っていますが、これは上書きし続けると思いますidList、私はそれに追加したいのでlong、ファイル内のすべての値のタプルになります-

file = open(filename, "rb")
    try:
        bytes_read = file.read(struct.calcsize("=l"))
        while bytes_read:
            # Read 4 bytes(long integer)
            idList = struct.unpack("=l", bytes_read)
            bytes_read = file.read(struct.calcsize("=l"))
    finally:
        file.close()
4

2 に答える 2

6

最も単純な(python 2.6以降):

import array
idlist = array.array('l')
with open(filename, "rb") as f:
    while True:
        try: idlist.fromfile(f, 2000)
        except EOFError: break
idtuple = tuple(idlist)

タプルは不変であるため、段階的に構築することはできません。したがって、別の(可変の)シーケンスを構築tupleし、最後にそれを呼び出す必要があります。もちろん、実際にタプルが特に必要ない場合は、最後のコストのかかるステップを保存して、配列やリストなどを保持できます。とにかく、のような組み込みの名前を踏みつけないようfileにすることをお勧めします;-)。

モジュールによって最も適切に処理されるジョブにモジュールを使用する必要ある場合(たとえば、賭けのため)、structarray

idlist = [ ]
with open(filename, "rb") as f:
    while True:
        bytes_read = f.read(struct.calcsize("=l"))
        if not bytes_read: break
        oneid = struct.unpack("=l", bytes_read)[0]
        idlist.append(oneid)

このwithステートメント(2.5では将来のインポートフォームでも利用可能)は、明確さと簡潔さにおいて、古いtry/finallyよりも優れています。

于 2010-05-19T14:00:13.697 に答える
0

変化する

idList = struct.unpack("=l", bytes_read)

idList.append(struct.unpack("=l", bytes_read)[0])
于 2010-05-19T14:32:22.647 に答える