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

Python folder recursion问题:多层目录下.txt文件读取失败求助

嘿,我懂你现在卡在Python遍历目录的问题上了——要处理Main文件夹下100个编号子文件夹,每个里面还有A/B/C/D这些子目录,目标是读取所有.txt文件对吧?我来给你几个实用的解决方案,应该能帮你摆脱困境。

方案1:用os.walk(最经典的目录遍历方式)

os.walk是Python标准库中专门用来遍历目录树的工具,它会自动帮你递归遍历所有子目录,我们只需要加个深度判断,确保只处理到第三层(A/B/C/D这一级)的.txt文件。

import os

# 替换成你的Main文件夹实际路径,比如 "C:/Users/xxx/Main" 或者 "/home/xxx/Main"
main_folder = "./Main"

for root, dirs, files in os.walk(main_folder):
    # 计算当前目录相对于Main的深度
    depth = len(root.split(os.sep)) - len(main_folder.split(os.sep))
    # 我们要的是Main -> 编号文件夹 -> A/B/C/D 这一级的txt文件,对应深度为2
    if depth == 2:
        for file in files:
            if file.endswith(".txt"):
                file_path = os.path.join(root, file)
                # 读取文件内容,这里示例是读取全部,你可以按需修改逻辑
                try:
                    with open(file_path, 'r', encoding='utf-8') as f:
                        content = f.read()
                        print(f"成功读取:{file_path}")
                        # 这里可以添加你的内容处理逻辑,比如解析数据、写入其他文件等
                except Exception as e:
                    print(f"读取文件{file_path}失败:{str(e)}")
方案2:用pathlib(更简洁的现代方式)

如果你用的是Python3.4及以上版本,pathlib是更推荐的方式,它用面向对象的方式处理路径,代码更直观简洁。

from pathlib import Path

main_folder = Path("./Main")  # 同样替换成你的实际路径

# 用glob模式匹配:*/ 匹配1-100的编号文件夹,**/ 匹配A/B/C/D子目录,*.txt匹配目标文件
# 如果确定子目录只有A/B/C/D,也可以写成 "*/[A-D]/*.txt",效率更高
for txt_file in main_folder.glob("*/**/*.txt"):
    try:
        with open(txt_file, 'r', encoding='utf-8') as f:
            content = f.read()
            print(f"成功读取:{txt_file}")
            # 这里添加你的处理逻辑
    except Exception as e:
        print(f"读取文件{txt_file}失败:{str(e)}")
方案3:自定义递归函数(手动控制遍历逻辑)

如果你想自己实现递归逻辑,也可以写一个简单的递归函数,通过跟踪当前目录深度来控制遍历范围:

import os

def read_target_txt(folder, current_depth=0, max_depth=2):
    # max_depth设为2,因为Main是第0层,编号文件夹是第1层,A/B/C/D是第2层
    if current_depth > max_depth:
        return
    
    for item in os.listdir(folder):
        item_path = os.path.join(folder, item)
        if os.path.isdir(item_path):
            # 如果是目录,递归进入,深度加1
            read_target_txt(item_path, current_depth + 1, max_depth)
        elif item.endswith(".txt") and current_depth == max_depth:
            # 只有在第2层目录下的txt文件才读取
            try:
                with open(item_path, 'r', encoding='utf-8') as f:
                    content = f.read()
                    print(f"成功读取:{item_path}")
            except Exception as e:
                print(f"读取文件{item_path}失败:{str(e)}")

# 调用函数,传入Main文件夹路径
read_target_txt("./Main")
一些注意事项
  • 路径正确性:确保你指定的Main文件夹路径是对的,相对路径是相对于你运行Python脚本的目录,不确定的话用绝对路径更稳妥。
  • 编码问题:打开文件时指定encoding='utf-8',如果你的txt文件是GBK等其他编码,记得替换成对应的编码,避免乱码。
  • 错误处理:加上try-except块可以避免个别文件读取失败导致整个脚本崩溃,比如文件损坏、权限不足等情况。

内容的提问来源于stack exchange,提问作者Derek

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:14:01