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的多次使用。它减慢了我的程序。