【问题标题】:Merge csv files if they have the same columns headers, if not split如果 csv 文件具有相同的列标题,则合并它们,如果不拆分
【发布时间】:2021-11-16 16:19:17
【问题描述】:

我有一个包含多个 csv 文件 (5k+) 的文件夹,要使用它们,最好使用相同的变量名和列数。但事实并非如此。

为了进行清理,我想根据它们的列创建一些子文件夹。例如,如果两个或多个 csv 具有相同的列和变量名称,则使用它们创建一个子文件夹。

到目前为止,我找到了如何组合所有文件,但我不知道将条件与匹配的列子文件夹放在哪里。

import glob
import pandas as pd

extension = 'csv'
all_filenames = [i for i in glob.glob('*.{}'.format(extension))]    

col_combined_csv = pd.concat([pd.read_csv(f) for f in all_filenames])

【问题讨论】:

  • 那么你想将所有具有相同标题的文件组合在一起吗?为什么需要子文件夹?只是为每个标题组合使用不同的名称?

标签: python database csv concatenation


【解决方案1】:

要将所有CSV文件与文件夹中的相同标题合并在一起,可以使用以下方法:

import csv
import glob

csv_files = {}      # (header as tuple) : csv.writer()
header_type_count = 1

for filename in glob.glob('*.csv'):
    with open(filename, newline='') as f_input:
        csv_input = csv.reader(f_input)
        header = tuple(next(csv_input))
        
        try:
            csv_files[header].writerows(csv_input)
        except KeyError:
            f_output = open(f'header_v{header_type_count:02}.csv', 'w', newline='')
            header_type_count += 1
            csv_output = csv.writer(f_output)
            csv_files[header] = csv_output
            csv_output.writerow(header)
            csv_output.writerows(csv_input)

这是通过跟踪所有不同的标头类型来实现的,并允许它们在运行中连接起来。对于找到的每个新标头类型,它都会打开一个新的输出 CSV 文件(例如 header_v01.csv)。

csv_files 将标头类型映射到打开的 csv.writer() 对象以允许写入额外的行。

这种方法避免了需要同时将所有数据保存在内存中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-18
    • 1970-01-01
    相关资源
    最近更新 更多