2013-06-28 52 views
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)) 

回答

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做這項工作,並返回'',從而從緩衝器中移除已處理的東西

+0

我能想到的有趣......唯一的問題是,它不會刪除不任何區域匹配,這將慢慢建立起來。也re.match電話應re.search我認爲 –

+0

@ʞɔıu:我假設你的正則表達式是「連續」 - 如果不是,是使用搜索,如果它匹配刪除匹配和它之前的一切,如'buf = BUF [match.end():]' – georg

相關問題