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