从子目录中搜索 CSV 并将文件夹名称添加为列
Posted
技术标签:
【中文标题】从子目录中搜索 CSV 并将文件夹名称添加为列【英文标题】:Search CSV from subdirectory and add folder name as a column 【发布时间】:2021-07-24 19:17:43 【问题描述】:我想从我的工作目录的不同子目录中读取 csv,以创建一个组合的 csv 文件。组合后的 csv 应该有一列包含从中读取特定 csv 的子目录名称。
这是我尝试过的。
import os
import glob
import pandas as pd
all_filenames = [i for i in glob.glob('*/*.csv'),recursive=True)]
list_subfolder = [f.name for f in os.scandir(ride_path) if f.is_dir()]
df_list = []
for i in range(len(all_filenames)):
dir_name = list_subfolder[i]
current_csv = all_filenames[i]
data = pd.read_csv(current_csv)
data["sub_folder"]= dir_name
df_list.append(data)
combined_df = pd.concat(df_list)
combined_df.to_csv("combined_csv.csv", index=False)
问题在于,它添加了其中没有 csvs' 的子目录,这是错误且有问题的。实现这一目标的最佳方式是什么。
【问题讨论】:
我想你想要glob.glob('**/*.csv', recursive=True)
可行,但主要问题是获取从其中读取 csv 的文件夹名称作为列
【参考方案1】:
您可以通过pathlib
模块进行此操作:
from pathlib import Path
inp_path = Path('.') # specify the inp path. Here, ('.') means current working dir
df_list= []
for csv_file in inp_path.glob('**/*.csv'): # glob here will return generator obj which will yield csv file one by one
df = pd.read_csv(csv_file)
df['file_name'] = csv_file.parent # possible to get parent dir via pathlib
df_list.append(df_list)
combined_df = pd.concat(df_list)
combined_df.to_csv("combined_csv.csv", index=False)
Note
.
1- 如果您只需要名称,请使用csv_file.parent.name
。
2- 如果您想要父目录的完整路径,请使用csv_file.parent.absolute()
。
【讨论】:
【参考方案2】:glob
和 os
的另一个选项:
import os
import glob
import pandas as pd
df_list = []
for csv in glob.glob('**/*.csv', recursive=True):
parent_folder = os.path.split(os.path.dirname(csv))[-1]
df = pd.read_csv(csv)
df['subfolder'] = parent_folder
df_list.append(df)
combined_df = pd.concat(df_list)
combined_df.to_csv("combined_csv.csv", index=False)
【讨论】:
【参考方案3】:您可以使用我们os.path.split()
:
import os
import glob
import pandas as pd
all_filenames = [i for i in glob.glob("**/*.csv", recursive=True)]
df_list = []
for f in all_filenames:
current_csv = f
data = pd.read_csv(current_csv)
data["sub_folder"] = os.path.split(f)[0] # <-- [0] is directory [1] is filename
df_list.append(data)
combined_df = pd.concat(df_list)
print(combined_df)
combined_df.to_csv("combined_csv.csv", index=False)
【讨论】:
【参考方案4】:单行法(改编自@nk03 答案)。
import pandas as pd
import pathlib as pth
pd.concat([pd.read_csv(csvfile).assign(file_name=csvfile.parent)
for csvfile in pth.Path(".").glob("**/*.csv")]) \
.to_csv("combined_csv.csv", index=False)
【讨论】:
以上是关于从子目录中搜索 CSV 并将文件夹名称添加为列的主要内容,如果未能解决你的问题,请参考以下文章
如何将 CSV 文件批量加载到 Snowflake 中,并将文件名添加为列?
Python脚本从文本文件grep字段并将输出写入csv文件