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
相关产品推荐
相关产品推荐

