我写了一个不错的小 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))