如何用os.walk避免手动指定子文件夹名优化CSV合并代码?
用os.walk替代手动罗列文件夹来批量读取并合并CSV文件
没问题,用os.walk完全可以实现自动遍历目标目录下的子文件夹,不用手动写那些日期文件夹名。我来给你拆解下思路和具体代码:
核心思路
os.walk会递归遍历指定目录的所有层级,每次返回三个值:当前目录路径、当前目录下的子文件夹列表、当前目录下的文件列表。我们可以利用它定位到所有目标子文件夹里的CSV文件,再批量读取合并。
考虑到你的需求是处理/Users/Name/Desktop/Datas/下的直接子文件夹(比如20170106这类日期文件夹),可以加个简单过滤:只处理根目录的第一级子文件夹,还能额外筛选出符合日期格式的文件夹,避免误读无关内容。
具体代码实现
import os import glob import pandas as pd # 根目录,即你的Datas文件夹路径 root_dir = "/Users/Name/Desktop/Datas/" # 初始化空列表,用来存放每个CSV文件读取后的DataFrame df_list = [] # 遍历根目录下的所有内容 for dirpath, dirnames, filenames in os.walk(root_dir): # 只处理根目录的直接子文件夹(也就是目标日期文件夹) if os.path.dirname(dirpath) == root_dir: # 可选:过滤出以2017开头的文件夹,避免误处理其他无关文件夹 if os.path.basename(dirpath).startswith("2017"): # 找到当前文件夹下所有CSV文件 csv_files = glob.glob(os.path.join(dirpath, "*.csv")) # 逐个读取CSV并加入列表 for csv_file in csv_files: df = pd.read_csv(csv_file) df_list.append(df) # 合并所有DataFrame为最终结果 final_df = pd.concat(df_list, ignore_index=True)
代码关键点说明
os.walk(root_dir):从指定根目录开始遍历,每次循环返回当前目录的路径、子文件夹名、文件名。os.path.dirname(dirpath) == root_dir:确保只处理根目录的直接子文件夹,不会递归进入更深层级(如果日期文件夹内还有子目录,可去掉此判断)。startswith("2017"):安全过滤步骤,只处理2017开头的日期文件夹,防止读取到无关文件夹的CSV。- 用列表
df_list存储每个CSV的DataFrame,最后一次性concat,比循环中反复合并的效率更高(文件数量多时更明显)。
如果你的Datas目录下只有目标日期文件夹,不需要过滤,直接去掉if os.path.basename(dirpath).startswith("2017"):这一行即可。
内容的提问来源于stack exchange,提问作者Dan_99
相关产品推荐
相关产品推荐

