遍历USEcorpus子目录下所有.txt文件的代码异常排查
解决遍历子目录下所有.txt文件的问题
问题诊断
你的代码只处理第一个子目录和文件,大概率是以下原因:
os.listdir(data_dir)会返回该路径下所有条目(包括文件和目录),如果USEcorpus下存在非目录文件,执行os.listdir(subdir)时会抛出NotADirectoryError,直接终止循环。- 没有过滤
.txt文件,若子目录下存在非文本文件,open()可能抛出编码或格式错误,中断流程。 - 变量名
dir是Python内置函数名,虽不报错但易引发混淆。
修复方案
方案1:修复原有代码逻辑
添加目录判断和文件后缀过滤,确保只处理目标内容:
import os # 定义根数据目录 data_dir = os.path.join("in", "USEcorpus") # 遍历USEcorpus下的所有条目 for subdir_name in os.listdir(data_dir): subdir_path = os.path.join(data_dir, subdir_name) # 跳过非目录条目 if not os.path.isdir(subdir_path): continue # 遍历子目录下的文件 for filename in os.listdir(subdir_path): # 只处理.txt后缀的文件(兼容大小写) if not filename.lower().endswith(".txt"): continue filepath = os.path.join(subdir_path, filename) # 读取并处理文本 with open(filepath, "r", encoding="latin-1") as file: text = file.read() # 这里添加你的NLP处理逻辑,比如打印文件路径验证遍历效果 print(f"已读取文件: {filepath}")
方案2:使用os.walk递归遍历(推荐)
os.walk会自动递归遍历目录结构,更简洁可靠:
import os data_dir = os.path.join("in", "USEcorpus") # 遍历目录树:root=当前目录, dirs=子目录列表, files=当前目录下的文件列表 for root, _, files in os.walk(data_dir): for filename in files: if filename.lower().endswith(".txt"): filepath = os.path.join(root, filename) with open(filepath, "r", encoding="latin-1") as file: text = file.read() # 执行NLP处理 print(f"已处理文件: {filepath}")
方案3:使用glob匹配目标文件
glob支持通配符匹配,直接获取所有目标文件路径,代码最简洁:
import glob import os # 匹配USEcorpus下所有子目录中的.txt文件(*匹配任意子目录) txt_file_paths = glob.glob(os.path.join("in", "USEcorpus", "*", "*.txt")) for filepath in txt_file_paths: with open(filepath, "r", encoding="latin-1") as file: text = file.read() # 执行NLP处理 print(f"已处理文件: {filepath}")
关键说明
- 使用
filename.lower().endswith(".txt")可以兼容大小写不同的后缀(如.TXT)。 - 若你的14个子目录下还有嵌套子目录,
os.walk会自动遍历所有层级,而glob需要调整通配符为**/*.txt并设置recursive=True。
内容的提问来源于stack exchange,提问作者MiaKuntz
相关产品推荐
相关产品推荐

