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))
我能想到的有趣......唯一的問題是,它不會刪除不任何區域匹配,這將慢慢建立起來。也re.match電話應re.search我認爲 –
@ʞɔıu:我假設你的正則表達式是「連續」 - 如果不是,是使用搜索,如果它匹配刪除匹配和它之前的一切,如'buf = BUF [match.end():]' – georg