Python按字节读取文件,直到按字节顺序读取为止
如何以Python逐字节读取文件,直到达到特定的字节序列 对于读取特定类型文件以解析标头、扫描参数等的库,这种情况必须一直发生 例如:我正在通读,看到像素数据在字节序列Python按字节读取文件,直到按字节顺序读取为止,python,file,png,file-header,Python,File,Png,File Header,如何以Python逐字节读取文件,直到达到特定的字节序列 对于读取特定类型文件以解析标头、扫描参数等的库,这种情况必须一直发生 例如:我正在通读,看到像素数据在字节序列IDAT之后开始 with open('image.png', 'rb') as f: lines = f.readlines() combined_line = b''.join(lines) IDAT_splited = combined_line.split(b'IDAT')[1:] 我可以这样读取
IDAT
之后开始
with open('image.png', 'rb') as f:
lines = f.readlines()
combined_line = b''.join(lines)
IDAT_splited = combined_line.split(b'IDAT')[1:]
我可以这样读取文件:
with open('image.png', 'rb') as f:
byte = f.read(1)
while byte != '':
byte = f.read(1)
但是因为我一次只读取一个字节,所以我不能直接查看IDAT
(因为我只能得到I
,而不能得到其他三个字节)。我无法按四个字节的块读取文件,因为它不能始终正确排列
我可以想象跟踪最后四个字节的情况,但我想也许有一种更优雅的方法?如果你不赞成逐字节读取的想法,你可以读取一个长字符串中的数据,然后按出现的
IDAT
将其拆分
with open('image.png', 'rb') as f:
lines = f.readlines()
combined_line = b''.join(lines)
IDAT_splited = combined_line.split(b'IDAT')[1:]
如果您不赞成逐字节读取数据,您可以读取一个长字符串中的数据,然后按
IDAT
的出现次数将其拆分
with open('image.png', 'rb') as f:
lines = f.readlines()
combined_line = b''.join(lines)
IDAT_splited = combined_line.split(b'IDAT')[1:]
使用
mmap
将文件视为一个巨大的字符串
import mmap
with open('image.png', 'rb') as f:
with mmap.mmap(f.fileno(), 0, mmap.PROT_READ) as mf:
offset = mf.find(b'IDAT')
if offset == -1:
raise Exception("IDAT not found")
f.seek(offset)
使用
mmap
将文件视为一个巨大的字符串
import mmap
with open('image.png', 'rb') as f:
with mmap.mmap(f.fileno(), 0, mmap.PROT_READ) as mf:
offset = mf.find(b'IDAT')
if offset == -1:
raise Exception("IDAT not found")
f.seek(offset)
谢谢在最后一行中,为什么从索引
1
读取而不是0
?因为数据在“IDAT”上拆分,第一个元素将在它出现之前谢谢!在最后一行中,为什么从索引1
读取而不是0
?因为数据是在“IDAT”上分割的,第一个元素将在它出现之前