基于python中的模板头合并多个csv文件

时间:2014-08-10 01:46:40

标签: python csv merge header

我有多个csv文件,它们都有或多或少相同的标题。有些可能有所有标题,有些人可能没有。 我想使用一个只有标题的公共csv文件并将它们全部合并。

示例标题:

a, b, c, d, e, f,

文件1:

a, b, d,
1, 2, 3,

文件2:

a, b, c, e,
4, 5, 6, 7,

合并结果:

a, b, c, d, e, f,
1, 2,  , 3,
4, 5, 6,  , 7,  ,

到目前为止,我被指向使用csv.DictReader,csv.DictWriter。 但是我在基于公共标头合并并保持标题顺序时遇到问题。无论如何我仍然可以使用它们而不是对它们进行排序?

我尝试过pandas merge功能,但需要根据我的数据不包含的顺序进行排序。

感谢任何帮助。 谢谢

1 个答案:

答案 0 :(得分:1)

所以我决定帮你创建一个课程。它返回一个生成器,您可以迭代它来构建最终文件。

import csv
class DataFile(object):
    empty = ''  # use this if col does not have value

    def __init__(self, filename):
        f = open(filename, 'r')
        self.reader = csv.reader(f)
        # set first line as header
        self.header = [x.strip() for x in self.reader.next()]

    def get_header(self):
        return self.header

    def with_header(self, headers):
        """ Returns a generator for specified headers"""
        header_dict = dict([(a, i,) for i, a in enumerate(self.header)])

        for line in self.reader:
            li = []
            for h in headers:
                if h in header_dict:
                    li.append(line[header_dict[h]])
                else:
                    li.append(self.empty)
            yield li

您可以使用它来加入文件:file1.csvfile2.csv因此:

>>> one = DataFile('file1.csv')
>>> two = DataFile('file2.csv')
>>> one.get_header()
['a', 'b', 'd', '']
>>> comb = set(one.get_header() + two.get_header())
>>> final = list(one.with_header(comb)) + list(two.with_header(comb))
>>> final
[['1', '', '', ' 2', '', ' 3'], ['4', '', ' 6', ' 5', ' 7', '']]

然后,您可以使用combfinal来构建新的csv文件(使用csv writer等)。此外,您可以构建一个接收多个文件的函数,只返回包含所有文件的所有列的新生成器等。通过修改empty属性,修改当值不在文件中时设置的字符。我认为这很容易理解