[英]Most efficient way to parse a large .csv in python?
我試着尋找其他答案,但我仍然不確定正確的方法。 我有一些非常大的.csv文件(每個可能是一個千兆字節),我想先得到他們的列標簽,因為它們不是全部相同,然后根據用戶偏好提取一些這些列的一些標准。 在我開始提取部分之前,我做了一個簡單的測試,看看解析這些文件的最快方法是什么,這是我的代碼:
def mmapUsage():
start=time.time()
with open("csvSample.csv", "r+b") as f:
# memory-mapInput the file, size 0 means whole file
mapInput = mmap.mmap(f.fileno(), 0)
# read content via standard file methods
L=list()
for s in iter(mapInput.readline, ""):
L.append(s)
print "List length: " ,len(L)
#print "Sample element: ",L[1]
mapInput.close()
end=time.time()
print "Time for completion",end-start
def fileopenUsage():
start=time.time()
fileInput=open("csvSample.csv")
M=list()
for s in fileInput:
M.append(s)
print "List length: ",len(M)
#print "Sample element: ",M[1]
fileInput.close()
end=time.time()
print "Time for completion",end-start
def readAsCsv():
X=list()
start=time.time()
spamReader = csv.reader(open('csvSample.csv', 'rb'))
for row in spamReader:
X.append(row)
print "List length: ",len(X)
#print "Sample element: ",X[1]
end=time.time()
print "Time for completion",end-start
我的結果是:
=======================
Populating list from Mmap
List length: 1181220
Time for completion 0.592000007629
=======================
Populating list from Fileopen
List length: 1181220
Time for completion 0.833999872208
=======================
Populating list by csv library
List length: 1181220
Time for completion 5.06700015068
所以似乎大多數人使用的csv庫實際上比其他人慢。 也許以后當我開始從csv文件中提取數據時它被證明更快,但我還不能確定。 在開始實施之前有什么建議和提示嗎? 非常感謝!
正如其他幾次指出的那樣,前兩種方法沒有實際的字符串解析,它們只是一次讀取一行而不提取字段。 我想在CSV中看到的大部分速度差異都歸因於此。
如果您包含的任何文本數據可能包含更多“標准”CSV語法而不僅僅是逗號,則CSV模塊非常有用,尤其是在您閱讀Excel格式時。
如果你剛剛得到像“1,2,3,4”這樣的線條,你可能會很簡單,但如果你有像"1,2,'Hello, my name\\'s fred'"
你”我會瘋狂地試圖解析那些沒有錯誤。
CSV還可以透明地處理引用字符串中間的換行符。 一個簡單的for..in
沒有CSV會遇到麻煩。
如果我像這樣使用它,CSV模塊一直很好地讀取unicode字符串:
f = csv.reader(codecs.open(filename, 'rU'))
它非常強大,可以導入數千行文件,其中包含unicode,帶引號的字符串,引用字符串中間的換行符,末尾缺少字段的行等,所有這些都具有合理的讀取時間。
我首先嘗試使用它,如果你真的需要額外的速度,只能在它上面尋找優化。
要讀取大型csv文件,我們必須創建子進程來讀取文件塊。 打開文件以獲取文件資源對象。 使用resource作為參數創建子進程。 將這組行讀作塊。 重復上述3個步驟,直到到達文件末尾。
from multiprocessing import Process
def child_process(name):
# Do the Read and Process stuff here.if __name__ == '__main__':
# Get file object resource.
.....
p = Process(target=child_process, args=(resource,))
p.start()
p.join()
有關代碼,請轉到此鏈接。 這會對你有所幫助。 http://besttechlab.wordpress.com/2013/12/14/read-csv-file-in-python/
您的前兩種方法不是將每一行解析為字段。 csv
方式是解析字段的行(與行!不同!)。
你真的需要在所有線路的內存中建立一個列表嗎?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.