首页 > 解决方案 > 如何将 300 个文件合并为 3 个文件?

问题描述

我在一个文件夹中有一堆文件。全部由三种不同的类型组成;三种不同的模式。我想将文件分为三种类型。

  1. 'FFIEC CDR 呼叫批量 POR'
  2. 'FFIEC CDR 呼叫时间表 CI'
  3. 'FFIEC CDR 呼叫时间表 ENT'

根据文件名相似,我想将这 300 个文件保存为 3 个 CSV 文件。

这是实际的文件名。

FFIEC CDR Call Bulk POR 03312001.txt
FFIEC CDR Call Bulk POR 03312002.txt
...
FFIEC CDR Call Schedule CI 03312001.txt
FFIEC CDR Call Schedule CI 03312002.txt
...
FFIEC CDR Call Schedule ENT 03312001.txt
FFIEC CDR Call Schedule ENT 03312002.txt

我认为问题出在这一行:

if x in f:

这是我正在测试的代码。

import os, glob
import pandas as pd

mylist = ['FFIEC CDR Call Bulk POR',
        'FFIEC CDR Call Schedule CI',
        'FFIEC CDR Call Schedule ENT']

path = "C:\\Users\\ryans\\OneDrive\\Desktop\\schemas\\"

all_files = glob.glob(os.path.join(path, "*.txt"))

all_df = []
for f in all_files: 
    for x in mylist:
        if x in f:
            print(x)
            df = pd.read_csv(f, delimiter='\t', skiprows=1) 
            df['file'] = os.path.basename(f)
            all_df.append(df) 

df_append = pd.concat(all_df, ignore_index=True, sort=True)
df_append.to_csv("C:\\Users\\ryans\\OneDrive\\Desktop\\" + x + ".csv")

当我运行此代码时,所有内容都转储到一个 CSV 文件中。我想要三个单独的 CSV 文件,一个用于每个相似/分组的文件名。我取得了一些进展,但我无法完全弄清楚。

标签: pythonpython-3.xdataframe

解决方案


坦率地说,问题似乎很原始,所以我不明白你为什么有问题

您将所有文件放在同一个列表中

all_df.append(df) 

所以最后它必须将所有文件写入一个 CSV。

您应该为三种类型的文件创建三个列表。或一本包含三个文件列表的字典

all_df = {
    'FFIEC CDR Call Bulk POR': [],  # list for files `FFIEC CDR Call Bulk POR`
    'FFIEC CDR Call Schedule CI': [], # list for files `FFIEC CDR Call Schedule CI`
    'FFIEC CDR Call Schedule ENT': [], # list for files `FFIEC CDR Call Schedule ENT
}

然后您可以使用x将文件放入正确列表

all_df[ x ].append(df) 

之后loop你可以使用另一个循环来保存三个文件

for x in mylist:
    # use `all_df[x]
    df_append = pd.concat(all_df[x], ignore_index=True, sort=True)
    df_append.to_csv("C:\\Users\\ryans\\OneDrive\\Desktop\\" + x + ".csv")

import os, glob
import pandas as pd

mylist = [
    'FFIEC CDR Call Bulk POR',
    'FFIEC CDR Call Schedule CI',
    'FFIEC CDR Call Schedule ENT'
]

path = "C:\\Users\\ryans\\OneDrive\\Desktop\\schemas\\"

all_files = glob.glob(os.path.join(path, "*.txt"))

all_df = {
    'FFIEC CDR Call Bulk POR': [],  # list for files `FFIEC CDR Call Bulk POR`
    'FFIEC CDR Call Schedule CI': [], # list for files `FFIEC CDR Call Schedule CI`
    'FFIEC CDR Call Schedule ENT': [], # list for files `FFIEC CDR Call Schedule ENT
}

# --- first loop ---

for f in all_files: 
    for x in mylist:
        if x in f:
            print(x)
            df = pd.read_csv(f, delimiter='\t', skiprows=1) 
            df['file'] = os.path.basename(f)
            all_df[x].append(df) 

# --- second loop ---

for x in mylist:
    # use `all_df[x]
    df_append = pd.concat(all_df[x], ignore_index=True, sort=True)
    df_append.to_csv("C:\\Users\\ryans\\OneDrive\\Desktop\\" + x + ".csv")

推荐阅读