Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python按字节读取文件,直到按字节顺序读取为止_Python_File_Png_File Header - Fatal编程技术网

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:] 我可以这样读取

如何以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:]
我可以这样读取文件:

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”上分割的,第一个元素将在它出现之前