我有多个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功能,但需要根据我的数据不包含的顺序进行排序。
感谢任何帮助。 谢谢
答案 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.csv
和file2.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', '']]
然后,您可以使用comb
和final
来构建新的csv文件(使用csv writer等)。此外,您可以构建一个接收多个文件的函数,只返回包含所有文件的所有列的新生成器等。通过修改empty
属性,修改当值不在文件中时设置的字符。我认为这很容易理解