我有数百个大型 CSV 文件,我想将它们合并为一个。但是,并非所有 CSV 文件都包含所有列。因此,我需要根据列名称而不是列位置来合并文件。
需要明确的是:在合并的 CSV 中,对于来自不包含该单元格列的行的单元格,值应该为空。
我无法使用 pandas 模块,因为它使我内存不足。
是否有一个模块可以做到这一点,或者一些简单的代码?
The csv.DictReader
and csv.DictWriter
类应该运行良好(参见Python 文档 https://docs.python.org/3.4/library/csv.html#csv.DictReader)。像这样的事情:
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,其中 CSV 模块中会发生奇怪的事情,而无需
newline=""
。对于 Python 2,删除此选项。
- 在此刻,
line
是一个以字段名称作为键、以列数据作为值的字典。您可以指定如何处理空白或未知值DictReader
and DictWriter
构造函数。
此方法不应耗尽内存,因为它永远不会立即加载整个文件。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)