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屬性的錯誤)。
任何幫助非常感謝!
嗨丹,感謝這個答案!它的工作就像一個魅力:)仍然試圖找出你到底在做什麼,以及爲什麼這真的起作用。例如,爲什麼在打開outfile後設置'dict_writer = None'?另外,爲什麼流程語句「如果不是dict_writer:」是必要的?再次感謝! – Matthijs
在Python中,如果一個變量設置爲None,那麼它將評估爲False。所以'如果不是dict_writer'和'如果dict_writer是None'是一樣的。基本上,這可以確保您只會創建一次dict_writer。 –
哦,'dict_writer = None'不需要在打開文件後完成 - 它也可以在之前完成。重要的是它發生在循環之外。爲了更好地感受Python,我建議你通過http://www.diveinto.org/python3/ –