自学内容网 自学内容网

羲和数据清洗器002

fix_json_line(line) 函数:

尝试直接解析 JSON。
如果解析失败,尝试修复常见的 JSON 格式错误,如引号和括号。
返回修复后的 JSON 对象,如果无法修复则返回 None。
convert_and_check_jsonl_file(input_file, log_file, output_file=None) 函数:

读取输入文件的每一行。
使用 fix_json_line 函数修复 JSON 格式错误。
如果 JSON 对象包含 “answer” 键,将其转换为 “xihe_answers” 和 “ling_answers”。
检查 JSON 对象是否符合要求,并记录错误信息到日志文件。
将有效的行保存到输出文件中。
示例用法
假设你有一个名为 data.jsonl 的文件,内容如下:

jsonl
{“question”: “11111”, “answer”: “22222”}
{“question”: “What is the capital of France?”, “xihe_answers”: [“Paris”], “ling_answers”: [“Paris”]}
{“question”: “What is 2 + 2?”, “xihe_answers”: [“4”], “ling_answers”: [4]} // 错误:ling_answers 应该是字符串列表
{“question”: “What is the largest planet in our solar system?”, “xihe_answers”: [“Jupiter”], “ling_answers”: [“Jupiter”]}
{“question”: “What is the capital of France?”, xihe_answers: [“Paris”], ling_answers: [“Paris”]} // 错误:缺少引号
运行程序后,选择 data.jsonl 作为输入文件,选择 valid_data.jsonl 作为输出文件。程序会生成一个 error_log.txt 文件,记录错误信息,并将有效的行保存到 valid_data.jsonl 中。

生成的
valid_data.jsonl
内容示例
jsonl
{“question”: “11111”, “xihe_answers”: [“22222”], “ling_answers”: [“22222”]}
{“question”: “What is the capital of France?”, “xihe_answers”: [“Paris”], “ling_answers”: [“Paris”]}
{“question”: “What is the largest planet in our solar system?”, “xihe_answers”: [“Jupiter”], “ling_answers”: [“Jupiter”]}
生成的
error_log.txt
内容示例
code
第 3 行错误: {“question”: “What is 2 + 2?”, “xihe_answers”: [“4”], “ling_answers”: [4]}
第 4 行错误: {“question”: “What is the capital of France?”, xihe_answers: [“Paris”], ling_answers: [“Paris”]}
通过这些改进,程序不仅能够检查和记录错误,还能自动修复常见的 JSON 格式错误,并将数据转换为所需的格式。

import json
import tkinter as tk
from tkinter import filedialog, messagebox
import re

def fix_json_line(line):
    # 尝试修复 JSON 格式错误
    try:
        # 尝试直接解析
        data = json.loads(line)
        return data
    except json.JSONDecodeError as e:
        # 尝试修复引号和括号
        fixed_line = re.sub(r'([{,]\s*)([a-zA-Z_][a-zA-Z0-9_]*)\s*:', r'\1"\2":', line)
        fixed_line = re.sub(r'([a-zA-Z_][a-zA-Z0-9_]*)(\s*[,}])', r'"\1"\2', fixed_line)
        fixed_line = re.sub(r'([{,]\s*"[^"]*")([^"]*")(\s*[,}])', r'\1\2\3', fixed_line

原文地址:https://blog.csdn.net/weixin_54366286/article/details/142917729

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!