2013-06-19 90 views
1

[使用Python3]我很新(Python)編程,但仍然編寫一個腳本掃描文件夾的某些csv文件,然後我想讀取它們並追加它們並將它們寫入另一個csv文件。Python:追加/合併多個csv文件尊重標題和寫入csv

在兩者之間需要僅在特定列中的值與設置標準匹配的情況下返回數據。

所有CSV文件具有相同的列,看起來像這樣的地方:

header1 header2 header3 header4 ... 
string float string float ... 
string float string float ... 
string float string float ... 
string float string float ... 
...  ...  ...  ...  ... 

我現在有工作的代碼如下(下同),但它只是不斷重寫數據從以前的文件。這對我來說確實有意義,但我無法弄清楚如何讓它工作。

代碼:

import csv 
import datetime 
import sys 
import glob 
import itertools 
from collections import defaultdict 

# Raw data files have the format like '2013-06-04'. To be able to use this script during the whole of 2013, the glob is set to search for the pattern '2013-*.csv' 
files = [f for f in glob.glob('2013-*.csv')] 

# Output file looks like '20130620-filtered.csv' 
outfile = '{:%Y%m%d}-filtered.csv'.format(datetime.datetime.now()) 

# List of 'Header4' values to be filtered for writing output 
header4 = ['string1', 'string2', 'string3', 'string4'] 

for f in files: 
    with open(f, 'r') as f_in: 
     dict_reader = csv.DictReader(f_in) 

     with open(outfile, 'w') as f_out: 
      dict_writer = csv.DictWriter(f_out, lineterminator='\n', fieldnames=dict_reader.fieldnames) 
      dict_writer.writeheader() 
      for row in dict_reader: 
       if row['Campaign'] in campaign_names: 
        dict_writer.writerow(row) 

我也嘗試過類似readers = list(itertools.chain(*map(lambda f: csv.DictReader(open(f)), files))),並試圖遍歷讀者但是當時我無法弄清楚如何使用接口兼容。 (我得到itertools.chain()沒有fieldnames屬性的錯誤)。

任何幫助非常感謝!

回答

3

您不斷重新打開文件並覆蓋它。

在循環開始之前打開outfile一次。對於您讀取的第一個文件,請寫入標題和行。對於其餘文件,只需寫入行。

喜歡的東西

with open(outfile, 'w') as f_out: 
    dict_writer = None 
    for f in files: 
     with open(f, 'r') as f_in: 
      dict_reader = csv.DictReader(f_in) 
      if not dict_writer: 
       dict_writer = csv.DictWriter(f_out, lineterminator='\n', fieldnames=dict_reader.fieldnames) 
       dict_writer.writeheader() 
      for row in dict_reader: 
       if row['Campaign'] in campaign_names: 
        dict_writer.writerow(row) 
+0

嗨丹,感謝這個答案!它的工作就像一個魅力:)仍然試圖找出你到底在做什麼,以及爲什麼這真的起作用。例如,爲什麼在打開outfile後設置'dict_writer = None'?另外,爲什麼流程語句「如果不是dict_writer:」是必要的?再次感謝! – Matthijs

+0

在Python中,如果一個變量設置爲None,那麼它將評估爲False。所以'如果不是dict_writer'和'如果dict_writer是None'是一樣的。基本上,這可以確保您只會創建一次dict_writer。 –

+0

哦,'dict_writer = None'不需要在打開文件後完成 - 它也可以在之前完成。重要的是它發生在循環之外。爲了更好地感受Python,我建議你通過http://www.diveinto.org/python3/ –