【问题标题】:run regex on file object instead of string在文件对象而不是字符串上运行正则表达式
【发布时间】: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))

【问题讨论】:

    标签: python regex parsing etl


    【解决方案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 在哪里完成这项工作并返回 '',从而从缓冲区中删除已处理的内容

    【讨论】:

    • 有趣...我能想到的唯一问题是它不会删除任何不匹配的区域,它会慢慢建立起来。我认为 re.match 电话也应该是 re.search
    • @ʞɔıu:我假设您的正则表达式是“连续的” - 如果不是,是的,使用搜索,如果匹配,则删除匹配项及其之前的所有内容,例如 buf = buf[match.end():]
    猜你喜欢
    • 2012-10-11
    • 2015-06-12
    • 1970-01-01
    • 1970-01-01
    • 2014-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多