1

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

1 回答 1

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并返回'',从而从缓冲区中删除已处理的内容

于 2013-06-28T18:16:08.520 回答