json_to_txt.py

import json
import argparse
from pathlib import Path
from typing import Any, Dict, List, Union

def convert_json_to_txt(json_data: Union[Dict, List], output_format: str = "simple") -> str:
    """
    将JSON数据转换为TXT格式字符串
    
    参数:
        json_data: JSON数据,可以是字典或列表
        output_format: 输出格式,支持'simple'、'indented'、'table'
    
    返回:
        转换后的TXT格式字符串
    """
    if output_format == "simple":
        return json.dumps(json_data)
    elif output_format == "indented":
        return json.dumps(json_data, indent=2, ensure_ascii=False)
    elif output_format == "table":
        # 表格格式只适用于JSON数组中的对象
        if not isinstance(json_data, list) or not json_data:
            return "表格格式只适用于非空JSON数组"
        
        # 提取所有可能的字段
        all_fields = set()
        for item in json_data:
            if isinstance(item, dict):
                all_fields.update(item.keys())
        
        # 按字母顺序排序字段
        fields = sorted(all_fields)
        
        # 生成表头
        header = " | ".join(fields)
        separator = "-+-".join(["-" * len(field) for field in fields])
        lines = [header, separator]
        
        # 生成数据行
        for item in json_data:
            if not isinstance(item, dict):
                lines.append(str(item))
                continue
                
            values = []
            for field in fields:
                value = item.get(field, "")
                # 处理嵌套结构
                if isinstance(value, (dict, list)):
                    value = json.dumps(value, ensure_ascii=False)
                values.append(str(value))
            lines.append(" | ".join(values))
            
        return "\n".join(lines)
    else:
        raise ValueError(f"不支持的输出格式: {output_format}")

def process_file(input_path: Path, output_path: Path, output_format: str) -> None:
    """
    处理单个JSON文件并转换为TXT
    
    参数:
        input_path: 输入JSON文件路径
        output_path: 输出TXT文件路径
        output_format: 输出格式
    """
    try:
        # 读取JSON文件
        with open(input_path, 'r', encoding='utf-8') as f:
            json_data = json.load(f)
        
        # 转换为TXT格式
        txt_content = convert_json_to_txt(json_data, output_format)
        
        # 写入TXT文件
        with open(output_path, 'w', encoding='utf-8') as f:
            f.write(txt_content)
            
        print(f"成功将 {input_path} 转换为 {output_path}")
    except json.JSONDecodeError:
        print(f"错误: 文件 {input_path} 不是有效的JSON格式")
    except Exception as e:
        print(f"错误: 处理文件 {input_path} 时发生异常: {e}")

def main() -> None:
    """主函数,处理命令行参数并执行转换"""
    parser = argparse.ArgumentParser(description='将JSON文件转换为TXT文件')
    parser.add_argument('input', help='输入JSON文件或目录')
    parser.add_argument('-o', '--output', help='输出TXT文件或目录,默认替换扩展名')
    parser.add_argument('-f', '--format', choices=['simple', 'indented', 'table'], 
                        default='indented', help='输出格式')
    parser.add_argument('-r', '--recursive', action='store_true', 
                        help='递归处理目录中的所有JSON文件')
    
    args = parser.parse_args()
    input_path = Path(args.input)
    
    # 处理单个文件
    if input_path.is_file():
        if input_path.suffix.lower() != '.json':
            print(f"错误: 文件 {input_path} 不是JSON文件")
            return
            
        output_path = Path(args.output) if args.output else input_path.with_suffix('.txt')
        process_file(input_path, output_path, args.format)
        return
    
    # 处理目录
    if input_path.is_dir():
        if not args.output:
            print("错误: 处理目录时必须指定输出目录 (-o)")
            return
            
        output_dir = Path(args.output)
        output_dir.mkdir(parents=True, exist_ok=True)
        
        # 获取所有JSON文件
        if args.recursive:
            json_files = list(input_path.rglob('*.json'))
        else:
            json_files = list(input_path.glob('*.json'))
            
        if not json_files:
            print(f"错误: 目录 {input_path} 中没有找到JSON文件")
            return
            
        # 处理每个JSON文件
        for json_file in json_files:
            # 构建输出路径,保持目录结构
            relative_path = json_file.relative_to(input_path)
            output_file = output_dir / relative_path.with_suffix('.txt')
            output_file.parent.mkdir(parents=True, exist_ok=True)
            
            process_file(json_file, output_file, args.format)
        return
    
    print(f"错误: 路径 {input_path} 不存在")

if __name__ == "__main__":
    main()    

1.转换单个 JSON 文件:
python json_to_txt.py input.json -o output.txt
2.转换目录中的所有 JSON 文件:
python json_to_txt.py input_dir -o output_dir -f table
3.递归转换目录中的所有 JSON 文件:
python json_to_txt.py input_dir -o output_dir -f indented -r

posted @ 2025-06-15 19:57  长恨水长东  阅读(23)  评论(0)    收藏  举报