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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 17:24:20