融合来自不同目录的许多具有相同名称的csv文件

时间:2020-11-03 00:55:23

标签: python pandas csv

我有4个不同的文件夹,每个文件夹都包含不同的csv文件。在所有文件夹中,csv文件的名称均相同,但是其中的数据来自不同的时间段。我现在想将所有具有相同名称的文件融合在一起。

现在的外观示例:

                     ###################
                     #   MAIN_FOLDER   #
#############################################################
#  Folder1    #    Folder2    #    Folder3    #    Folder4  #
#-----------------------------------------------------------#
# A_foo.csv   #   A_foo.csv   #   A_foo.csv   #   A_foo.csv #
# A_bar.csv   #   A_bar.csv   #   A_bar.csv   #   A_bar.csv #
# B_foo.csv   #   B_foo.csv   #   B_foo.csv   #   B_foo.csv #
# B_bar.csv   #   B_bar.csv   #   B_bar.csv   #   B_bar.csv #
#             #               #               #             # 
#############################################################

因此,主要类别A具有不同的子类别_foo_barB也是如此。 (实际上,不止A-Z,还有大约30个子类别) 我想遍历所有可能的主要类别及其各自的子类别。然后合并名称相同的文件,而不会覆盖任何数据。 CSV文件的外观应相同,但列和索引相同。但是,其中一些索引在正常datetime中具有unix datetime索引。但是一旦文件合并,我就可以解决。

最终结果示例:

for folder in MAIN_FOLDER:
    for category in MAIN_CATEGORIES:
        for subcategory in SUBCATEGORIES:
             file=folder+'/'+category+'_'+subcategory+'.csv'         
                 if name_of_file is same:
                    merge_file_into_one_without_overwriting_any_data()


#################
#  MAIN_FOLDER  #
#---------------#   
#   A_foo.csv   #
#   A_bar.csv   #
#   B_foo.csv   #
#   B_bar.csv   #
#               # 
#################


4 个答案:

答案 0 :(得分:1)

您可以尝试这样:

import os
from glob import glob
import csv

result = [y for x in os.walk("MAIN_FOLDER") for y in glob(os.path.join(x[0], '*.csv'))]

rows = []
for f in result:
    reader = csv.reader(open(f, "rb"))
    for row in reader:
        rows.append(row)

writer = csv.writer(open("OUTPUT.csv", "wb"))
writer.writerows("\n".join(rows))

答案 1 :(得分:1)

在bash脚本中,还可以使用以下方法解决给定类别和子类别的问题:

find . -name "A_foo.csv" | xargs cat | dd of=A_foo.csv

应该为MAIN_FOLDER中的所有类别和子类别运行。 例如(脚本的内容):

#!/bin/bash

cats='A B C'
subcats='foo bar'

for c in $cats
do
   for s in $subcats
   do
      files=${c}'_'${s}'.csv'
      find . -name "*$files*" | xargs cat | dd of=$files
   done
done 

答案 2 :(得分:1)

所有文件夹中的文件名都是相同的,因此您只需要遍历一个子文件夹。获得文件名后,您只需插入其他文件夹名称即可。

folder1 = "Folder1"
other_folders = ["Folder2", "Folder3", "Folder4"]

for filename in os.listdir(folder1):
    if filename.endswith(".csv"):
        for other_folder in other_folders:
            otherfilename = os.path.join(other_folder, filename)
            # now process otherfilename

答案 3 :(得分:0)

我最终按照自己的意愿进行了操作。

import pandas as pd
import glob
pd.set_option('display.max_rows', None)
pd.set_option('display.max_colwidth', None)

CONCAT_DIR = "new_path"

files = pd.DataFrame([file for file in glob.glob("/MAIN_FOLDER/*/*")], columns=["fullpath"])

files_split = files['fullpath'].str.rsplit("/", 1, expand=True).rename(columns={0: 'path', 1:'filename'})

files = files.join(files_split)

for f in files['filename'].unique():
    paths = files[files['filename'] == f]['fullpath'] 
    dfs = [pd.read_csv(path, header=None,error_bad_lines=False) for path in paths]
    concat_df = pd.concat(dfs) 
    concat_df.to_csv(CONCAT_DIR + f) 
    print(concat_df)