2016-06-21 64 views
-3

我有一个大的(3.5GB)工作.csv文件,我不能完全在内存中处理和希望:如何检查一个大的csv的每一行,如果某列中包含某个特定的值,则可以写入该行?

  • 读取数据的一行
  • 检查一个字段等于给定条件
  • 如果为true,则将该行附加到新的.csv文件。如果为假,直到达到原始文件的末尾

的最终结果将是包含与条件匹配的所有行单独的.csv跳到下一行

  • 循环。

  • +1

    请提供您已经编写的代码,以便我们可以帮助您做到正确。 – TehSphinX

    +0

    [在Python中读取大文本文件,一行一行地将其加载到内存中](http://stackoverflow.com/questions/6475328/read-large-text-files-in-python-line-by-line-没有加载到内存中) – rsm

    +0

    欢迎朋友。为了让你的问题对于想要帮助的人能够理解和“有吸引力”,请考虑发布你迄今尝试过的任何代码,你试图分析的* .csv的一些代表行,等等。 。付出一些努力吧.. –

    回答

    0

    我发现以下为我工作。请注意,这也为列表中的每个条件值生成了一个单独的输出文件。

    import csv 
    
    # criteria is the column number from the source data to check against the values list 
    criteria = 4 
    
    valueslist= ['criteria1','criteria2','criteria3'] 
    
    for item in valueslist: 
    
        with open('sourcedata.csv', 'rb') as inf, open(item + '.csv','wb') as outf: 
         reader = csv.reader(inf) 
         writer = csv.writer(outf) 
    
         # -- Write Headers as first row 
         writer.writerow(["column1", "column2", "column3"]) 
         for row in reader: 
          if row[criteria] == item: 
           writer.writerow(row) 
    
    1

    请尝试下面的代码。设置合适数量的记录(您的机器允许)为块大小。

    chunksize = 10 ** 5 
    for chunk in pd.read_csv(filename, chunksize=chunksize): 
        df=df.append (chunk [chunk.field==criterion]) 
    
    2

    我会做这种方式:

    chunksize = 10**6 // 2 # you may want to adjust it ... 
    for chunk in pd.read_csv(filename, chunksize=chunksize): 
        (chunk.query('condition1 & condition2 & ... ') 
          .to_csv('output.csv', mode='a', index=False)) 
    

    诀窍是mode='a'参数,它会指导大熊猫补充,而不是覆盖CSV文件行...

    相关问题