You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 10:43:15