当前位置: 首页 > 面试题库 >

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

楚浩然
2023-03-14
问题内容

我尝试寻找其他答案,但仍不确定正确的方法。我有许多个非常大的.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的文件将会遇到麻烦。

如果我像这样使用Unicode字符串,那么CSV模块对我来说总是可以正常工作:

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

对于导入具有unicode,带引号的字符串,带引号的字符串中间的换行符,末尾缺少字段的行等的数以千计的行文件,以及具有合理读取时间的导入,它具有足够的鲁棒性。

我会首先尝试使用它,并且如果您确实需要额外的速度,则只在它之上寻找优化。



 类似资料:
  • 问题内容: 我需要从超过2GB的文件中更新最后一行,这些文件由无法读取的文本行组成。目前,它可以通过逐行循环工作。但是,我想知道是否有任何编译的库可以更有效地实现这一目标?谢谢! 目前的方法 问题答案: 更新:使用ShadowRanger的答案。它更短且更健壮。 对于后代: 读取文件的最后N个字节,然后向后搜索换行符。

  • 问题内容: 我目前正在根据Python Cookbook的12.5章运行以下代码: 我正在使用大小约为1 GB的XML文档。有谁知道解析这些的更快方法? 问题答案: 我看起来好像您不需要程序中的任何DOM功能。我将第二次使用(c)ElementTree库。如果使用cElementTree模块的iterparse函数,则可以遍历xml并在事件发生时对其进行处理。 但是请注意,Fredriks关于使用

  • 问题内容: -我只是解析了一个大文件,然后创建了一个包含42.000个字符串/单词的列表。我想查询[针对此列表]以检查给定的单词/字符串是否属于它。所以我的问题是: 进行查找的最有效方法是什么? 第一种方法是对列表()进行排序,然后使用 这确实是微不足道的,我相信有更好的方法可以做到。我的目标是应用快速查找来查找给定字符串是否在此列表中。如果您对其他数据结构有任何想法,欢迎使用。但是,我现在想避免

  • 问题内容: 给定一个有效的CSS颜色值的字符串: ffffff 白色 rgb(255,255,255) 需要获取以下格式的数字数组:[R,G,B] 用JavaScript(假设使用主要的浏览器)最有效的方法是什么? 问题答案: 显然,数值比名称更容易解析。所以我们先做那些。 那是一个 现在获取完整的六位数格式: 现在是格式: 另外,您还可以添加支持的格式,甚至/ 如果添加HSL2RGB转换功能。

  • 问题内容: 我有非常大的XML文件要处理。我想将它们转换为具有颜色,边框,图像,表格和字体的可读PDF。我的机器上没有很多资源,因此,我需要我的应用程序对内存和处理器的寻址非常理想。 我进行了不起眼的研究,以使自己对所使用的技术有所了解,但是我无法确定什么是满足我的要求的最佳编程语言和API。我认为DOM不是一个选择,因为它会占用大量内存,但是带SAX解析器的Java是否可以满足我的要求? 有人还

  • 这个问题的目的是提供一个规范的答案。 给定一个可能由Excel或其他工具生成的CSV,其中在字段中嵌入了换行符和/或双引号和/或逗号,以及空字段,例如: 使用awk有效识别单独记录和字段的最健壮方法是什么: 因此,它可以在awk脚本的其余部分内部用作这些记录和字段。 有效的CSV应符合RFC 4180或可由MS Excel生成。 解决方案必须允许记录结尾仅为LF(),这是UNIX文件的典型情况,而