在文件对象上运行正则表达式而不是字符串

时间:2013-06-28 17:47:21

标签: python regex parsing etl

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

1 个答案:

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