Python如何读取子文件夹所有txt文件并将四位数字内容存入列表
问题背景
需要实现的功能:遍历指定根路径下所有层级的子文件夹,仅读取后缀为.txt的文本文件,提取文件中存储的四位数字内容归集到列表中。原有编写的代码未实现递归读取、内容归集的预期效果。
原有代码如下:
import os path = "C:\python_projects\PythonProgramming\data-task1\q6" (example) os.chdir(path) def read_text_file(file_path): with open(file_path, 'r') as f: print(f.read()) for file in os.listdir(): if file.endswith(".txt"): file_path = f"{path}\{file}" read_text_file(file_path)
原有代码问题点
- 仅使用
os.listdir()只能获取当前工作目录下的直接文件和文件夹名,不会递归进入子目录扫描,无法读取嵌套子文件夹里的txt文件 - 仅实现了文件内容打印逻辑,没有做四位数字提取、内容归集到列表的处理
- 手动用
\{file}拼接Windows路径存在转义风险,不同层级路径拼接容易出现分隔符错误 - 额外调用
os.chdir()切换工作目录属于非必要操作,容易引发后续路径定位异常 - 路径定义行末尾的
(example)是注释内容,直接写在代码行中会触发语法错误,注释内容需要用#开头标注
可运行实现方案
方案1:基于os.walk()实现(全Python版本兼容)
os.walk()是Python标准库提供的目录递归遍历方法,会自动遍历根路径下所有层级的子目录,不需要手动编写递归逻辑。
import os import re # 目标根路径,字符串前加r标记为原始字符串,避免反斜杠触发转义 root_path = r"C:\python_projects\PythonProgramming\data-task1\q6" result_list = [] # 正则规则:匹配独立的四位连续数字,避免从更长数字串中误截取片段 num_pattern = re.compile(r'\b\d{4}\b') # 每次遍历返回三个值:当前目录路径、当前目录下子文件夹列表、当前目录下文件列表 for current_dir, _, file_list in os.walk(root_path): for file_name in file_list: # 统一转小写判断后缀,避免.TXT大写后缀的文件被遗漏 if file_name.lower().endswith(".txt"): # 用os.path.join自动适配系统路径分隔符,拼接文件完整路径 file_full_path = os.path.join(current_dir, file_name) try: # 显式指定文件编码,避免不同系统默认编码不一致导致乱码、报错 with open(file_full_path, 'r', encoding='utf-8') as f: content = f.read() # 提取当前文件中所有符合规则的四位数字,追加到结果列表 match_nums = num_pattern.findall(content) result_list.extend(match_nums) except Exception as e: # 遇到权限不足、文件损坏等异常时打印提示,不中断整体遍历流程 print(f"跳过异常文件 {file_full_path},错误信息:{str(e)}") # 输出最终归集的结果 print(f"提取完成,所有四位数字列表:{result_list}")
关键说明:
- 如果你的txt文件中只单独存储四位数字、没有其他混杂内容,可以去掉正则匹配逻辑,直接用
result_list.append(content.strip())即可,不需要导入re模块 - 判断后缀时用
lower()转小写,可以兼容.TXT这类大写后缀的文件,避免漏读 - 异常捕获逻辑可以根据实际需求调整,确定所有文件都正常可读时也可以去掉
方案2:基于pathlib实现(Python3.4+支持,写法更简洁)
Python3.4+新增的pathlib模块提供了面向对象的路径处理能力,递归匹配文件的写法更简洁:
from pathlib import Path import re root_path = Path(r"C:\python_projects\PythonProgramming\data-task1\q6") result_list = [] num_pattern = re.compile(r'\b\d{4}\b') # rglob方法会递归匹配所有符合*.txt规则的文件 for txt_file in root_path.rglob("*.txt"): try: content = txt_file.read_text(encoding='utf-8') result_list.extend(num_pattern.findall(content)) except Exception as e: print(f"跳过异常文件 {txt_file},错误信息:{str(e)}") print(f"提取完成,所有四位数字列表:{result_list}")
内容的提问来源于stack exchange,提问作者Joao Orsini
相关产品推荐
相关产品推荐

