python - 合并 csv 文件,将原始文件名添加到输出文件中的每一行
问题描述
我在一个具有相同数据结构的文件夹中有多个 csv 文件,
0.00;1.05;10.5
0.01;2.05;15.5
0.02;3.05;20.5
...
我想将所有 csv 文件合并到 1 个摘要文件中,并根据原始数据源向每一行添加一个带有文件名的列。
0.00;1.05;10.5;csv1.csv
0.01;2.05;15.5;csv1.csv
0.02;3.05;20.5;csv1.csv
0.00;5.05;0.05;csv2.csv
0.01;6.05;1.05;csv2.csv
0.02;7.05;2.05;csv2.csv
...
我设法合并文件,但找不到添加文件名的方法。
files = []
for file in os.listdir(folder):
if file.endswith('.csv'):
files.append(file)
with open('results.csv', 'w', newline='') as fw:
cw = csv.writer(fw)
for file in files:
with open(file, newline='') as f:
cr = csv.reader(islice(f,13,None)
cw.writerows(cr)
由于内存限制,我不想使用 pandas concat。谢谢。
解决方案
您不需要解析输入的 csv 文件,只需将分隔符和当前文件名附加到每一行。您可以使用该fileinput
模块:
import fileinput
from pathlib import Path
folder = '.' # set accordingly, assume current directory
path = Path(folder)
with fileinput.input(files=path.glob('*.csv')) as f, open('results.csv', 'w') as outfile:
for line in f:
print(';'.join([line.rstrip('\n'), fileinput.filename().name()]), file=outfile)
关于您的代码,您可以像这样修复它:
import os
import csv
folder = '.'
files = []
for file in os.listdir(folder):
if file.endswith('.csv'):
files.append(file)
with open('results.csv', 'w', newline='') as fw:
cw = csv.writer(fw, delimiter=';')
for file in files:
with open(file, newline='') as f:
for row in csv.reader(f, delimiter=';'):
row.append(file)
cw.writerow(row)
此处delimiter
参数设置为分号,因为默认分隔符是逗号,并且您的文件使用;
. 这将修复输入 csv 文件的正确解析,并;
用于输出文件。然后通过读取每一行并将文件名附加到行列表来处理每个输入文件。最后将新行写入输出 CSV 文件。
推荐阅读
- java - 使用 Java 8 构建复杂的地图
- c - 缓冲区溢出:使用 pwntools 发送漏洞更改字节
- java - 如何从文档中计算今天日期和日期之间的日差,但在弹性搜索脚本中消除时间
- vue.js - 在单击事件上切换 vue 中的组件
- c# - HttpClientFactory:带有附加构造函数参数的类型化 HttpClient
- ruby - 如何从 XML 字符串或文件中删除表情符号,无论它们是否已编码
- google-cloud-platform - 如何使用 Google Cloud Service Account 在两个服务之间进行身份验证
- c++ - MongoDB 使用数组中的 OR 条件构建查询
- python - 有效地添加到最短存储桶
- ibm-watson - 在 Watson Visual Recognition 上训练模型