python csv合并单元格_在Python中使用不同的列合并csv

本文介绍如何使用Python的csv模块合并多个CSV文件,并确保所有文件的列名一致。通过遍历所有输入文件获取字段名,然后使用csv.DictReader和csv.DictWriter进行数据复制。注意,对于Python3,需要在打开CSV文件时设置newline=''参数,而在Python2中则不需要。
摘要由CSDN通过智能技术生成

csv.DictReader和csv.DictWriter类应该工作良好(请参见Python docs)。像这样的:import csv

inputs = ["in1.csv", "in2.csv"] # etc

# First determine the field names from the top line of each input file

# Comment 1 below

fieldnames = []

for filename in inputs:

with open(filename, "r", newline="") as f_in:

reader = csv.reader(f_in)

headers = next(reader)

for h in headers:

if h not in fieldnames:

fieldnames.append(h)

# Then copy the data

with open("out.csv", "w", newline="") as f_out: # Comment 2 below

writer = csv.DictWriter(f_out, fieldnames=fieldnames)

for filename in inputs:

with open(filename, "r", newline="") as f_in:

reader = csv.DictReader(f_in) # Uses the field names in this file

for line in reader:

# Comment 3 below

writer.writerow(line)

以上评论:您需要在DictWriter之前指定所有可能的字段名,因此您需要循环浏览所有CSV文件两次:一次查找所有头,一次读取数据。没有更好的解决方案,因为在DictWriter可以写入第一行之前,需要知道所有的头。使用集合而不是列表(列表上的in操作符比较慢)这一部分会更有效,但是对于几百个标题来说,这不会有太大的区别。集合也会失去列表的确定顺序——每次运行代码时,列的顺序都会不同。

上面的代码是针对Python 3的,在没有newline=""的CSV模块中会发生奇怪的事情。对于Python2,删除此项。

此时,line是一个dict,字段名作为键,列数据作为值。可以指定如何处理DictReader和DictWriter构造函数中的空值或未知值。

此方法不应耗尽内存,因为它从不同时加载整个文件。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值