合并具有相似文件名的多个 CSV

Merge multiple CSVs with the similar filename

我在一个目录 (1000+) 中有大量包含不同数据的 CSV。几个 CSV 比其他的有 more/fewer 列,我希望能够合并列相同的每个 CSV。幸运的是,每个 CSV 文件名中都有一个字符串,有助于表示它也属于哪个“组”。

考虑这 3 个例子:

CSV1 named: **Report3443_GMA_45_20210516_111358.csv**
Contains:
| Date       | ID     | Amount  |
| ---------- | ------ | ------- |
| 01/05/2021 | GMA_45 | 1565.43 |
| 02/05/2021 | GMA_45 | 58963.9 |
| 05/05/2021 | GMA_45 | 962.27  |

CSV2 named: **Report7853_ATH_16_20210516_095745.csv**
Contains:
| Date       | ID     | Amount  | Subgroup |
| ---------- | ------ | ------- | -------- |
| 03/05/2021 | ATH_16 | 6345.01 | 861312   |
| 04/05/2021 | ATH_16 | 7824.69 | 861312   |
| 09/05/2021 | ATH_16 | 962.27  | 846131   |

CSV3 named: **Report45896_GMA_45_20210516_143825.csv**
Contains:
| Date       | ID     | Amount  |
| ---------- | ------ | ------- |
| 11/05/2021 | GMA_45 | 9915.12 |
| 14/05/2021 | GMA_45 | 66452.05|
| 15/05/2021 | GMA_45 | 4893.85 |

如您所见,CSV1 和 CSV3 包含相同的文件名字符串 (GMA_45),并且它们具有相同的列数。我想要这些 CSV 的合并版本,以及文件名中的字符串相同的任何其他迭代。

我使用此 中的代码开始了一些更改。代码工作正常,尽管输出 CSV 在每行之间写入一个空行,并且每次附加匹配的 CSV 时都会复制 header。我怎样才能删除空白行并删除任何重复的 header entires(除了主要的 header)?我还想删除任何重复的行。

这是我的代码:

import glob
import os
import pandas

def create_merged_csv(key, filelist):
    with open('Concat_{}.csv'.format(key), 'w+t') as outfile:
        for filename in filelist:
            df = pandas.read_csv(filename, header=None)
            df.to_csv(outfile, index=False, header=None)

def find_filesets(path="."):
    csv_files = {}
    for name in glob.glob("{}/*_*.csv".format(path)):
        key = '_'.join(name.split('_')[1:-2])
        csv_files.setdefault(key, []).append(name)

    for key,filelist in csv_files.items(): 
        print(key, filelist)
        create_merged_csv(key, filelist)

TEST_DIR_NAME="C:\Users\ME\Desktop\Python\MergeFiles\Input"
os.chdir("MergeFiles")
find_filesets(TEST_DIR_NAME)

我更新了代码,请查看

import glob
import os
import pandas

def create_merged_csv(key, filelist):
    outfile = 'Concat_{}.csv'.format(key)
    l = []
    for filename in filelist:
        df = pandas.read_csv(filename)
        l.append(df)
    pd.concat(l).to_csv(outfile, index=False)

def find_filesets(path="."):
    csv_files = {}
    for name in glob.glob("{}/*_*.csv".format(path)):
        key = '_'.join(name.split('_')[1:-2])
        csv_files.setdefault(key, []).append(name)

    for key,filelist in csv_files.items(): 
        print(key, filelist)
        create_merged_csv(key, filelist)

TEST_DIR_NAME="C:\Users\ME\Desktop\Python\MergeFiles\Input"
os.chdir("MergeFiles")
find_filesets(TEST_DIR_NAME)

这可能有帮助