2015-08-08 27 views
1

我需要用Python解析一個相當大的csv文件。爲此我使用csv(文件包含引號),並且我想使用多處理來並行執行此過程。每個進程只會從mmap文件對象中讀取它的行。但在實施這一方法,我所面臨的下一個問題(我知道有聲明蟒蛇,這僅僅是一個演示):Python:在mmap文件上的csv.reader工作不正確

import csv 


f = open('temp', 'r+b') 

reader = csv.reader(f) 
reader.next() 

f.close() 

。OUPUTS:

['1000415037534300', '2013-07-14 13:25:13.000000', 'request', '281', 'Camino', 'LG'] 

和that`s正確的,但考慮到這例如:

import csv 
import mmap 


f = open('temp', 'r+b') 
m = mmap.mmap(f.fileno(), 0) 

reader = csv.reader(m) 
reader.next() 
reader.next() 
reader.next() 

m.close() 
f.close() 

打印

['1'] 
['0'] 
['0'] 

換句話說,它從文件中讀取一個字節。 我必須使用mmap,因爲沒有其他方法允許多個進程使用同一個文件。 問題是,爲什麼csv.reader的行爲如此奇怪與mmap對象? mmap對象與standart python文件對象具有相同的API,因此csv.reader可以正常工作。

回答

1

您可以使用iter與readline的閱讀每一行:

reader = csv.reader(iter(m.readline, "")) 

如果您遍歷m,你會在同一時間得到一個字符,從而使米到讀者會出現相同的行爲

+0

有爲什麼mmap以這種方式實現迭代器? –

+1

我想你可以像m [:n]'那樣對mmap對象進行切片以獲得n個字節這一事實是有意義的,它以字節而不是行或m [:n]'進行迭代會給你n行而不是n字節 –