【发布时间】:2017-10-27 23:22:21
【问题描述】:
巨大的纯文本数据文件
我使用 python 分块读取了一个巨大的文件。然后我对该块应用正则表达式。基于标识符标签,我想提取相应的值。由于块大小,块边界处缺少数据。
要求:
- 文件必须分块读取。
- 块大小必须小于 或等于 1 GiB。
Python 代码示例
identifier_pattern = re.compile(r'Identifier: (.*?)\n')
with open('huge_file', 'r') as f:
data_chunk = f.read(1024*1024*1024)
m = re.findall(identifier_pattern, data_chunk)
块数据示例
好:标签数等于值数
标识符:值
标识符:值
标识符:值
标识符:值
由于块大小,您会遇到如下所列的不同边界问题。第三个标识符返回一个不完整的值,“v”而不是“value”。下一个块包含“alue”。这会导致解析后数据丢失。
错误:标识符值不完整
标识符:值
标识符:值
标识符:v
你如何解决这样的块边界问题?
【问题讨论】:
-
也许你可以在这里找到答案:Python regex parse stream
-
由于您的模式出现在行边界上,也许您可以一次读取一行并在行上匹配而不是块。
-
文件是否基于行?
-
@PedroLobito:不,不幸的是该文件不是基于行的。