繁体   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