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
相关产品推荐
相关产品推荐

