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
浙公网安备 33010602011771号