将Python中的二进制文件读入结构中

时间:2010-05-19 13:42:44

标签: python struct binaryfiles

如何在Python中打开二进制数据文件并回读值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()

2 个答案:

答案 0 :(得分: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这样的内置名称; - )。

如果您 struct模块用于array模块最佳处理的作业(例如,因为下注),

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更清晰,更简洁。

答案 1 :(得分:0)

更改

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

idList.append(struct.unpack("=l", bytes_read)[0])