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

Python 3.6 递归写入多个文本文件:基于现有代码的技术实现问询

解决方案

没问题,我帮你调整代码来实现递归遍历XML并生成对应文本文件的功能。先看修改后的完整代码,再给你拆解关键改动点:

#!/usr/bin/env python3
import glob
import os
import xml.etree.ElementTree as ET

# 递归遍历BNC目录下所有XML文件(包括子目录)
xml_pattern = r"C:\Users\####\Desktop\BNC\**\*.xml"
filenames = glob.glob(xml_pattern, recursive=True)

# 可选:创建统一的输出目录,保持原XML的子目录结构
output_root = r"C:\Users\####\Desktop\BNC_output"
os.makedirs(output_root, exist_ok=True)

for filename in filenames:
    # 生成对应的输出文件路径(这里用第二种方式:保持目录结构存到指定输出目录)
    # 计算当前XML相对于BNC根目录的路径
    relative_path = os.path.relpath(filename, r"C:\Users\####\Desktop\BNC")
    # 拼接输出路径,替换后缀为txt
    output_filename = os.path.join(output_root, relative_path)
    output_filename = os.path.splitext(output_filename)[0] + ".txt"
    # 自动创建输出文件所需的子目录
    os.makedirs(os.path.dirname(output_filename), exist_ok=True)
    
    # 解析XML文件
    with open(filename, 'r', encoding="utf-8") as content:
        tree = ET.parse(content)
        root = tree.getroot()
    
    # 提取w元素的信息并整理成行
    output_lines = []
    for w in root.iter('w'):
        # 处理空文本和空属性,统一替换为####
        token_text = w.text if w.text is not None else "####"
        lemma = w.get('hw') if w.get('hw') is not None else "####"
        pos = w.get('pos') if w.get('pos') is not None else "####"
        tag = w.get('c5') if w.get('c5') is not None else "####"
        
        # 按制表符分隔字段,你可以根据需求调整格式
        line = f"{token_text}\t{lemma}\t{pos}\t{tag}"
        output_lines.append(line)
    
    # 写入对应的文本文件
    with open(output_filename, 'w', encoding="utf-8") as out_file:
        out_file.write('\n'.join(output_lines))
    
    print(f"完成处理:{output_filename}")

关键改动说明

  • 递归遍历XML文件:用glob.glob配合recursive=True,**会匹配任意层级的子目录,这样能一次性抓到BNC文件夹下所有的XML文件,不管嵌套多深——这完全适配Python3.6的环境。

  • 输出路径管理:我给你做了两种可选的输出方式(代码里注释了第一种):

    • 方式1:和原XML文件同目录生成同名txt,直接替换后缀即可;
    • 方式2:在指定的BNC_output目录下保持原有的子目录结构,这样输出文件和原文件完全分离,更方便管理。用os.makedirs(..., exist_ok=True)会自动创建需要的子目录,不会因为目录不存在报错。
  • 逐文件写入:不再把所有XML的内容都堆到一个列表里,而是处理完一个XML就立刻写入对应的txt文件,这样内存占用更小,哪怕你有上千个XML文件也不会卡。

  • 补全空值处理:把你原来没写完的tag属性处理补全了,统一用if ... is not None else "####"的逻辑,保持代码风格一致,避免遗漏空值。

注意事项

  • 记得把代码里的C:\Users\####\Desktop\BNC替换成你实际的目录路径;
  • 如果需要调整输出的字段分隔符(比如用空格代替制表符),直接修改line = f"{token_text}\t{lemma}\t{pos}\t{tag}"里的分隔符即可;
  • Python3.6完全支持代码里的所有语法(包括f-string、glob的recursive参数、os.makedirs的exist_ok参数),不用担心兼容性问题。

内容的提问来源于stack exchange,提问作者pglove

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:50:02