如何批量将多层目录中XML、JSON、TEXT混合文件转换为CSV?
现有代码的核心问题
- 语法错误:遍历到文件时调用
open(final path,"rt"),变量名拼写错误,final path缺少下划线应为final_path,代码直接无法运行。 - 逻辑断裂:三层循环遍历得到了所有子文件路径,但仅执行了无意义的
open操作,后续读取JSON的代码直接传入根目录路径json_file_path,完全没有用到遍历得到的单个文件路径。 - 格式适配缺失:需求是同时处理
XML、JSON、TEXT三类文件,现有代码仅支持JSON读取,没有对应XML、TEXT的解析逻辑。 - 路径处理不规范:使用硬编码的
//拼接路径,跨平台兼容性差,多层嵌套循环写法冗余,硬编码排除.DS_Store的逻辑可优化。 - 缺少合并逻辑:如果需要将所有文件内容合并输出为同一个CSV,需要提前初始化空的DataFrame存储各文件解析后的数据,再统一导出。
- 资源泄漏风险:
open打开文件后没有执行关闭操作,也没有使用with上下文管理器自动释放资源。
调整后可运行的实现方案
先安装所需第三方依赖:pip install pandas xmltodict
import pandas as pd import os import xmltodict from collections.abc import MutableMapping # 配置路径 root_path = "/Users/ruzi/Desktop/top1000_complete" output_csv_path = "/Users/ruzi/Desktop/output.csv" # 初始化空DataFrame存储所有数据 all_data = pd.DataFrame() def parse_json(file_path): """解析JSON文件,单条JSON格式可删除lines=True参数""" return pd.read_json(file_path, lines=True) def parse_xml(file_path): """解析XML文件转为DataFrame,自动展平嵌套结构""" with open(file_path, 'r', encoding='utf-8') as f: xml_dict = xmltodict.parse(f.read()) # 递归展平嵌套字典 def flatten(d, parent_key='', sep='_'): items = [] for k, v in d.items(): new_key = parent_key + sep + k if parent_key else k if isinstance(v, MutableMapping): items.extend(flatten(v, new_key, sep=sep).items()) else: items.append((new_key, v)) return dict(items) flat_dict = flatten(xml_dict) return pd.DataFrame([flat_dict]) def parse_text(file_path): """解析TEXT文件,可根据TEXT实际结构调整解析逻辑""" with open(file_path, 'r', encoding='utf-8') as f: content = f.read() # 结构化TEXT可按分隔符拆分字段,非结构化TEXT直接存为单字段即可 return pd.DataFrame([{"text_content": content}]) # 递归遍历所有子目录文件,替代冗余的三层嵌套循环 for root, dirs, files in os.walk(root_path): for file in files: # 跳过Mac系统缓存文件 if file == '.DS_Store': continue file_path = os.path.join(root, file) suffix = file.split('.')[-1].lower() try: # 按文件后缀匹配对应解析逻辑 if suffix == 'json': df = parse_json(file_path) elif suffix == 'xml': df = parse_xml(file_path) elif suffix in ['txt', 'text']: df = parse_text(file_path) else: # 跳过其他不相关格式文件 continue # 单文件解析结果追加到总数据集 all_data = pd.concat([all_data, df], ignore_index=True) except Exception as e: print(f"文件{file_path}解析失败,已跳过,错误信息:{e}") continue # 统一导出为CSV all_data.to_csv(output_csv_path, index=False, encoding='utf-8-sig')
如果你的TEXT、XML文件有特定的结构化规则,对应修改parse_text、parse_xml函数内的解析逻辑即可。
内容的提问来源于stack exchange,提问作者ruzi
相关产品推荐
相关产品推荐

