Python函数读取子目录文件异常:需定位revenue_folder目标文件
嘿,我完全get到你的需求了——你想写一个Python函数,既能处理单个文件也能处理文件夹,核心是要精准定位到所有名为revenue_folder的目录里的目标文件,避免误处理其他子目录里的无关内容对吧?我来给你分享一个实用的解决方案!
解决方案思路
核心思路就是定向遍历:遍历目录时只在遇到revenue_folder时读取其中的文件,其他目录仅继续递归查找是否包含revenue_folder,不会处理里面的其他文件,这样就不会“误入”无关子目录了。同时兼顾单个文件的情况,检查它是否位于revenue_folder下。
完整代码示例
import os import pandas as pd def read_revenue_files(input_path): # 用来存储所有读取到的DataFrame collected_data = [] def scan_for_revenue_folders(current_dir): # 遍历当前目录下的所有条目 for entry in os.scandir(current_dir): if entry.is_dir(): # 找到目标文件夹revenue_folder if entry.name == 'revenue_folder': # 读取该文件夹下的所有表格文件 for file_entry in os.scandir(entry.path): if file_entry.is_file(): file_ext = file_entry.name.lower().split('.')[-1] # 只处理常见的表格文件格式,可按需扩展 if file_ext in ['csv', 'xlsx', 'xls']: print(f"正在读取: {file_entry.path}") # 根据文件后缀选择读取方法 if file_ext == 'csv': df = pd.read_csv(file_entry.path) else: df = pd.read_excel(file_entry.path) collected_data.append(df) else: # 不是目标文件夹,继续递归查找里面是否有revenue_folder scan_for_revenue_folders(entry.path) else: # 如果是单个文件,检查它的父目录是否是revenue_folder parent_folder = os.path.basename(os.path.dirname(entry.path)) if parent_folder == 'revenue_folder': file_ext = entry.name.lower().split('.')[-1] if file_ext in ['csv', 'xlsx', 'xls']: print(f"正在读取: {entry.path}") if file_ext == 'csv': df = pd.read_csv(entry.path) else: df = pd.read_excel(entry.path) collected_data.append(df) # 先判断输入路径的类型 if os.path.isfile(input_path): # 传入的是单个文件,从它的父目录开始扫描 scan_for_revenue_folders(os.path.dirname(input_path)) elif os.path.isdir(input_path): # 传入的是文件夹,直接开始扫描 scan_for_revenue_folders(input_path) else: print(f"错误:路径 {input_path} 不存在或无效") # 返回所有读取到的数据,你可以按需合并成一个DataFrame或者单独使用 return collected_data
关键细节说明
- 定向遍历逻辑:只有遇到
revenue_folder才会读取其中的文件,其他目录仅递归查找目标文件夹,不会处理无关内容,完美解决你说的“进入其他子目录”的问题。 - 文件格式兼容:默认支持csv、xlsx、xls格式,你可以通过修改
file_ext的判断列表来添加更多格式(比如.txt)。 - 单个文件处理:如果传入的是单个文件,会自动检查它是否在
revenue_folder下,符合条件才读取。 - 高效遍历:使用
os.scandir()比传统的os.listdir()更快,因为它直接返回文件/目录的属性信息。
额外优化建议
- 如果只需要读取
revenue_folder里特定名称的文件(比如monthly_revenue.csv),可以在判断文件时加上file_entry.name == 'monthly_revenue.csv'的条件。 - 可以根据需求添加读取参数,比如
pd.read_csv()的encoding='utf-8'、sep=';',或者pd.read_excel()的sheet_name='Sheet1'。 - 如果需要合并所有读取到的DataFrame,可以在函数末尾加上
return pd.concat(collected_data, ignore_index=True)(前提是所有数据结构一致)。
内容的提问来源于stack exchange,提问作者Krownose
相关产品推荐
相关产品推荐

