Python:附加/合并多个关于头文件的csv文件并写入csv

时间:2013-06-19 13:11:11

标签: python csv python-3.x

[使用Python3]我是(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属性。)

非常感谢任何帮助!

1 个答案:

答案 0 :(得分: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)