2016-06-21 68 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文件行...

    相關問題