如何合并保存在同一主文件夹中不同子文件夹中的2000 CSV文件

时间:2019-04-20 05:40:45

标签: python csv

嘿,我想将2000个Csv文件合并到2000个子文件夹之一中。每个子文件夹包含三个名称不同的Csv文件。所以我只需要从每个文件夹中选择一个Csv。

我知道用于合并一堆Csv文件的代码(如果它们在同一文件夹中)。

rndNum

但是我的2000 Csv文件问题看起来完全不同。

文件夹结构为: 主文件夹(在这2000个子文件夹中,在子文件夹中,我有多个Csv文件,我只需要从中选择一个Csv文件。最后隐藏所有2000个Csv文件。)

遵循命名约定(所有子文件夹都有不同的名称,但是子文件夹名称和该子文件夹中的Csv名称相同)

任何建议或示例代码(如何从子文件夹读取2000 Csv)都将有所帮助。

预先感谢

4 个答案:

答案 0 :(得分:1)

我们可以迭代每个子文件夹,确定expected_csv_path,检查是否存在。如果存在,我们将它们添加到我们的all_files列表中。

尝试以下操作:

import pandas as pd
import os

path = r'Total_csvs'
li = []
for f in os.listdir(path):
    expected_csv_path = os.path.join(path, f, f + '.csv')
    csv_exists = os.path.isfile(expected_csv_path)
    if csv_exists:
        df = pd.read_csv(expected_csv_path, index_col=None, header=0)
        li.append(df)

frame = pd.concat(li, axis=0, ignore_index=True, sort=False)
frame.to_csv('Total.csv',index=False)

答案 1 :(得分:1)

您可以使用os.listdir遍历所有子文件夹。

由于CSV文件名与子文件夹名称相同,因此只需使用子文件夹名称来构造完整路径名。

import os
import pandas

folders = os.listdir("Total_csvs")

li = []

for folder in folders:
    # Since they are the same name
    selected_csv = folder
    filename = os.path.join(folder, selected_csv + ".csv")

    df = pd.read_csv(filename, index_col=None, header=0)
    li.append(df)

frame = pd.concat(li, axis=0, ignore_index=True)
frame.to_csv('Total.csv',index=False)

答案 2 :(得分:0)

您可以执行以下操作而无需加入路径:

import pathlib,pandas

lastparent=None
for ff in pathlib.Path("Total_csvs").rglob("*.csv"):  # recursive glob
    print(ff)
    if(ff.parent!=lastparent):  # process the 1st file in the dir
        lastparent= ff.parent
        df = pd.read_csv(str(ff),... )
        ...etc.

答案 3 :(得分:0)

如果您使用的是Python 3.5或更高版本,则可以按照以下方式以递归方式使用glob.glob

import glob
path = r'Total_csvs'
all_csv = glob.glob(path+"/**/*.csv",recursive=True)

现在all_csv*.csv内所有Total_csvTotal_csv的子目录以及Total_csv的子目录的子目录的相对路径的列表。 例如,假设all_csv现在是:

all_csv = ['Total_csvs/abc/abc.csv','Total_csv/abc/another.csv']

因此,我们需要获取名称与其居住目录相对应的文件,可以通过以下方式完成:

import os
def check(x):
    directory,filename = x.split(os.path.sep)[-2:]
    return directory+'.csv'==filename
all_csv = [i for i in all_csv if check(i)]
print(all_csv) #prints ['Total_csvs/abc/abc.csv']

现在all_csv是您要搜索的所有.csv的路径列表,在“扁平”(非递归)情况下,您可以像使用all_csv一样使用它。