合并具有相似文件名的多个 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)
这可能有帮助
我在一个目录 (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 的合并版本,以及文件名中的字符串相同的任何其他迭代。
我使用此
这是我的代码:
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)
这可能有帮助