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

如何批量将多层目录中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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 21:09:00