Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 对文件对象而不是字符串运行正则表达式_Python_Regex_Parsing_Etl - Fatal编程技术网

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

Python 对文件对象而不是字符串运行正则表达式,python,regex,parsing,etl,Python,Regex,Parsing,Etl,我编写了一个很好的小sql-to-csv表达式(见下文),它可以处理我想要处理的mysqldump数据的格式 但是,我想浏览一下非常大的文件,这些文件可能太大,无法放入内存。输入可以是[gb]压缩的,并且不包含换行符。理想情况下,我希望能够处理从网络位置读入的输入数据,而不是先下载数据,然后从磁盘读取文件 如何在类似文件的对象上运行正则表达式或使用分块读取 def sql2csv(buf): rowmatcher = re.compile(r""" (?<=\()

我编写了一个很好的小sql-to-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))
def sql2csv(buf):
rowmatcher=re.compile(r”“”

(?也许是这样的

#pseudocode

buf = read(1024)
while True:
   if re.match(regexp, buf):
        buf = re.sub(regexp, do_stuff, buf)
   else:
        buf += read(1024)

其中,
dou_stuff
执行作业并返回
'
,从而从缓冲区中删除已处理的内容

类似的内容

#pseudocode

buf = read(1024)
while True:
   if re.match(regexp, buf):
        buf = re.sub(regexp, do_stuff, buf)
   else:
        buf += read(1024)

其中,
do_stuff
执行任务并返回
'
,从而从缓冲区中删除已处理的内容

有趣的是……我能想到的唯一问题是,它不会删除任何不匹配的区域,这将慢慢累积。此外,重新匹配调用应该是重新搜索我认为@uɔu:我假设您的regexp是“continuous”-如果不是,则使用搜索,如果匹配,则删除匹配及其之前的所有内容,如
buf=buf[match.end():]
有趣……我能想到的唯一问题是,它不会删除任何不匹配的区域,这将慢慢积累。此外,re.match调用应该是re.search。我想@ʞɔıu:我假设你的regexp是“连续的”-如果不是,则使用search,如果匹配,则删除匹配及其之前的所有内容,如
buf=buf[match.end():]