如何读取一个大的二进制文件并通过一些标记分割其内容

Spa*_*man 8 python

在Python中,逐行读取大文本文件很简单:

for line in open('somefile', 'r'): ...
Run Code Online (Sandbox Code Playgroud)

但是如何读取二进制文件并通过某个给定的标记"分割"(通过生成器)其内容,而不是换行符'\n'?

我想要这样的东西:

content = open('somefile', 'r').read()
result = content.split('some_marker')
Run Code Online (Sandbox Code Playgroud)

但是,当然,内存效率高(文件大约70GB).当然,我们无法通过每个字节读取文件(由于HDD的性质,它会太慢).

"块"长度(这些标记之间的数据)可能不同,理论上从1字节到兆字节.

因此,举一个例子来总结,数据看起来像那样(这里的数字是指字节,数据是二进制格式):

12345223-MARKER-3492-MARKER-34834983428623762374632784-MARKER-888-MARKER-...
Run Code Online (Sandbox Code Playgroud)

有没有简单的方法可以做到这一点(没有实现大块读取,拆分块,记住尾巴等)?

use*_*342 5

Python中没有任何魔法会为你做到,但是写起来并不难.例如:

def split_file(fp, marker):
    BLOCKSIZE = 4096
    result = []
    current = ''
    for block in iter(lambda: fp.read(BLOCKSIZE), ''):
        current += block
        while 1:
            markerpos = current.find(marker)
            if markerpos == -1:
                break
            result.append(current[:markerpos])
            current = current[markerpos + len(marker):]
    result.append(current)
    return result
Run Code Online (Sandbox Code Playgroud)

通过将其转换为生成器(即转换result.append(...)为)可以进一步减少此功能的内存使用量yield ....这留给读者作为练习.


Eri*_*own 0

Readline 本身以块的形式读取、分割块、记住尾部等。所以,不。