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

spa*_*agi 12 python csv

我试着寻找其他答案,但我仍然不确定正确的方法.我有一些非常大的.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
Run Code Online (Sandbox Code Playgroud)

我的结果是:

=======================
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
Run Code Online (Sandbox Code Playgroud)

所以似乎大多数人使用的csv库实际上比其他人慢.也许以后当我开始从csv文件中提取数据时它被证明更快,但我还不能确定.在开始实施之前有什么建议和提示吗?非常感谢!

Mic*_*att 16

正如其他几次指出的那样,前两种方法没有实际的字符串解析,它们只是一次读取一行而不提取字段.我想在CSV中看到的大部分速度差异都归因于此.

如果您包含的任何文本数据可能包含更多"标准"CSV语法而不仅仅是逗号,则CSV模块非常有用,尤其是在您阅读Excel格式时.如果你刚刚得到像"1,2,3,4"这样的线条,你可能会很简单,但如果你有像"1,2,'你好,我的名字就是弗雷德'这样的线你"我会疯狂地试图解析那些没有错误.CSV还可以透明地处理引用字符串中间的换行符.一个简单的for..in没有CSV会遇到麻烦.

如果我像这样使用它,CSV模块一直很好地读取unicode字符串:

f = csv.reader(codecs.open(filename,'rU'))

它非常强大,可以导入数千行文件,其中包含unicode,带引号的字符串,引用字符串中间的换行符,末尾缺少字段的行等,所有这些都具有合理的读取时间.我首先尝试使用它,如果你真的需要额外的速度,只能在它上面寻找优化.