Python 读入二进制文件

Python 读入二进制文件,python,Python,我想知道是否有一种方法可以读取二进制文件中的字节序列。 我需要读取文件不同位置的大量值 这是我正在做的一个例子: filein = open(name, 'rb') liste_octet = [0, 8, 16, 20] val = '' for pos_octet in liste_octet: filein.seek(pos_octet, 1) val += filein.read(4) 有可能做类似的事情吗 filein = open(name, 'rb') liste

我想知道是否有一种方法可以读取二进制文件中的字节序列。 我需要读取文件不同位置的大量值

这是我正在做的一个例子:

filein = open(name, 'rb')
liste_octet = [0, 8, 16, 20]
val = ''
for pos_octet in liste_octet:
    filein.seek(pos_octet, 1)
    val += filein.read(4)
有可能做类似的事情吗

filein = open(name, 'rb')
liste_octet = [0, 8, 16, 20]
filein.read(octet)
这似乎是我的工作。假设您正在阅读字符:

with open(filename) as fin:
    for offest in offsets:
         fin.seek(offest)
         val += struct.unpack('s',fin.read(4))

据我所知,没有直接的方法来执行
filein.read(八位字节)
。但是,稍微重新排列现有代码可以轻松生成一个小的辅助函数:

def read_at_positions(filename, positions, length):
    data = []
    with open(filename, 'rb') as fh:
        for pos in positions:
            fh.seek(pos)
            data.append(fh.read(length))
    return data
现在,您可以使用
在位置(名称[0,8,16,20,4])处读取

我已经使用了来处理打开的文件对象,您可能想在中了解一些关于它的信息。

看看这个模块。它允许您以字节字符串的形式访问文件,但无需将整个文件加载到内存中:

import mmap

offsets = [0, 12, 32, 56]

with open(..., 'rb') as fp:
    mm = mmap.mmap(fp.fileno(), 0)

    # Load the octects in a list.
    octects = [mm[i:i+4] for i in offsets]
    # Or concatenate them into a byte string.
    val = b''.join(mm[i:i+4] for i in offsets)

为什么要费心读很多遍呢?为什么不一次阅读多次使用呢?这与OP所做的不同,它会给出完全不同的结果results@PadraicCunningham:事实上,我用的是绝对偏移量,他用的是SEEK\u CUR。方法可能有明显的不同,但是这解决了读取“我文件不同位置的大量值”的问题(mmap对于这类事情非常有效)。方法是相同的,您需要调用
mm.seek(offset,1)
,并使用与OP代码相同的循环,如果OP正在执行许多可能是系统调用的操作,mmap将更加有效,但它也需要连续的地址块来存储数据file@PadraicCunningham字体但那就不是一行了。而且,据我所知,OP需要一行代码。不,但它会给出与OP代码相同的答案,使用mmap的唯一优势是它比使用系统调用(如seek、read等)更有效。没有一行代码可以匹配OP代码。我已经使用struct来解码我的值。问题是read的多次使用。它减慢了我的程序。