【发布时间】:2013-06-28 17:47:21
【问题描述】:
我写了一个漂亮的小 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))
【问题讨论】: