我写了一个很好的小sql到csv表达式(下面),它适用于我想要处理的mysqldump数据的格式。
但是,我想通过非常大的文件来处理这些文件,这些文件可能太大而无法放入内存中。输入可以是[gb]压缩并且不包含换行符。理想情况下,我希望能够处理输入数据,因为它是从网络位置读入的,而不是先下载它然后从磁盘上读取文件。
如何在类似文件的对象上运行正则表达式或使用分块读取?
def sql2csv(buf):
rowmatcher = re.compile(r"""
(?<=\()
(?:
(?:
-?\d+(?:\.\d+)?
|NULL
|'(?:[^'\\]|\\')*'
)
(?:,|(?=\)))
)+
(?=\)[,;])
""", re.X)
return (
[r.decode('string_escape').decode('utf8') for r in row]
for row in csv.reader(
(x.group(0) for x in rowmatcher.finditer(buf)),
quotechar="'", escapechar='\\', doublequote=False))
答案 0 :(得分:1)
这样的事可能吗?
#pseudocode
buf = read(1024)
while True:
if re.match(regexp, buf):
buf = re.sub(regexp, do_stuff, buf)
else:
buf += read(1024)
其中do_stuff
执行作业并返回''
,从而从缓冲区中删除已处理的内容