我有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
和_bar
。 B
也是如此。 (实际上,不止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 #
# #
#################
答案 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)