簡體   English   中英

在python中解析大型.csv的最有效方法?

[英]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模塊非常擅長理解不同的csv文件方言,並確保轉義正常,但它肯定是過度殺戮,而且往往比它的價值更麻煩(特別是如果你有unicode!)

一個真正天真的實現,正確逃脫\\,將是:

import re

def read_csv_naive():
    with open(<file_str>, 'r') as file_obj:
      return [re.split('[^\\],', x) for x in file_obj.splitlines()]

如果您的數據很簡單,這將非常有用。 如果你有可能需要更多轉義的數據, csv模塊可能是你最穩定的賭注。

要讀取大型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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM