如何使用Python os模块遍历主目录子目录并对txt文件执行代码
原有代码问题说明
你写的代码核心问题是路径不完整:os.listdir('../main_directory') 仅返回主目录下条目的名称,不带主目录路径前缀,直接对返回的名称调用os.listdir()会在当前工作目录下查找对应文件夹,大概率触发路径不存在的报错。
另外不建议通过os.chdir()切换工作目录的方式实现遍历,这种写法如果中途抛出异常,工作目录不会自动还原,很容易引发后续相对路径操作的隐性bug,也完全不需要手动用f字符串拼接路径,Python自带的路径处理工具会自动适配不同操作系统的路径分隔符,比手动拼接可靠得多。
可直接运行的实现方案
方案1:基于os模块(兼容所有Python版本)
仅遍历主目录的直接子目录
如果只需要处理主目录下第一层子目录里的txt文件,不需要递归更深层级,用下面的写法:
import os main_path = '../main_directory' for entry_name in os.listdir(main_path): # 拼接得到子目录的完整路径 sub_dir_path = os.path.join(main_path, entry_name) # 跳过主目录下的零散文件,只处理子目录 if not os.path.isdir(sub_dir_path): continue # 遍历当前子目录下的所有条目 for file_name in os.listdir(sub_dir_path): file_path = os.path.join(sub_dir_path, file_name) # 只处理txt格式的文件,跳过嵌套文件夹和其他格式文件 if os.path.isfile(file_path) and file_name.endswith('.txt'): # 此处写入你的文件处理逻辑,file_path就是目标txt的完整路径 print(f"处理文件: {file_path}") # 示例:读取文件内容 # with open(file_path, 'r', encoding='utf-8') as f: # content = f.read()
递归遍历所有层级子目录
如果需要处理主目录下所有嵌套层级的txt文件(包括子目录里的子目录),直接用os.walk()即可,不需要手动写多层循环:
import os main_path = '../main_directory' for root, _, files in os.walk(main_path): for file_name in files: if file_name.endswith('.txt'): file_path = os.path.join(root, file_name) # 此处写入文件处理逻辑 print(f"处理文件: {file_path}")
方案2:基于pathlib(Python3.4+ 推荐写法)
pathlib是Python3之后官方推荐的路径处理模块,写法更简洁,不需要手动拼接路径:
from pathlib import Path main_path = Path('../main_directory') # 仅遍历第一层子目录的txt文件 for sub_dir in main_path.iterdir(): if not sub_dir.is_dir(): continue for txt_file in sub_dir.glob('*.txt'): # 此处写入处理逻辑,txt_file为Path对象,可直接调用open等方法 print(f"处理文件: {txt_file}") # 示例读取内容: # content = txt_file.read_text(encoding='utf-8') # 递归遍历所有层级子目录的txt文件,把上面的glob换成rglob即可 # for txt_file in main_path.rglob('*.txt'): # 处理逻辑
注意事项
- 不要手动用f字符串拼接路径斜杠:Windows系统路径分隔符为
\,Linux/macOS为/,手动拼接的代码跨系统运行会直接报错,用os.path.join或者pathlib的内置方法会自动适配系统分隔符。 - 遍历过程中必须加类型判断:
os.listdir()会返回目录下所有内容,包括隐藏文件、子文件夹、其他后缀的文件,不加判断直接按txt文件处理会触发报错。 - 非必要不要调用
os.chdir():切换工作目录带来的路径问题排查成本极高,直接传递完整路径的写法稳定性高很多。
内容的提问来源于stack exchange,提问作者AutoBotBot
相关产品推荐
相关产品推荐

