在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)
有没有简单的方法可以做到这一点(没有实现大块读取,拆分块,记住尾巴等)?
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 ....这留给读者作为练习.
| 归档时间: |
|
| 查看次数: |
11047 次 |
| 最近记录: |