首页 > 解决方案 > 合并 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。谢谢。

标签: pythoncsvmerge

解决方案


您不需要解析输入的 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 文件。


推荐阅读