当前位置: 首页 > article >正文

Python Json格式数据处理

示例:查看和编辑 JSON 文件的 Python 程序

import json
from pprint import pprint

def load_json(file_path):
    """
    加载并解析 JSON 文件。
    
    :param file_path: JSON 文件路径
    :return: 解析后的 JSON 对象(字典或列表)
    """
    try:
        with open(file_path, 'r', encoding='utf-8') as f:
            data = json.load(f)
        return data
    except Exception as e:
        print(f"Error loading JSON file: {e}")
        return None

def save_json(file_path, data):
    """
    将 JSON 对象保存到文件中。
    
    :param file_path: JSON 文件路径
    :param data: 要保存的 JSON 对象(字典或列表)
    """
    try:
        with open(file_path, 'w', encoding='utf-8') as f:
            json.dump(data, f, ensure_ascii=False, indent=4)
        print(f"JSON file saved successfully to {file_path}")
    except Exception as e:
        print(f"Error saving JSON file: {e}")

def edit_json(data):
    """
    编辑 JSON 数据。
    
    :param data: JSON 对象(字典或列表)
    :return: 编辑后的 JSON 对象
    """
    pprint(data)  # 打印当前数据结构
    while True:
        key_or_index = input("Enter the key/index you want to edit (or type 'done' to finish editing): ").strip()
        if key_or_index.lower() == 'done':
            break
        
        if isinstance(data, dict):
            if key_or_index in data:
                value = input(f"Enter new value for '{key_or_index}': ")
                try:
                    # Try to convert the input string to appropriate data type
                    value = json.loads(value)
                except json.JSONDecodeError:
                    pass  # If it's not valid JSON, keep it as a string
                data[key_or_index] = value
            else:
                print(f"Key '{key_or_index}' not found.")
        elif isinstance(data, list):
            try:
                index = int(key_or_index)
                if 0 <= index < len(data):
                    value = input(f"Enter new value for index [{index}]: ")
                    try:
                        # Try to convert the input string to appropriate data type
                        value = json.loads(value)
                    except json.JSONDecodeError:
                        pass  # If it's not valid JSON, keep it as a string
                    data[index] = value
                else:
                    print(f"Index '{index}' out of range.")
            except ValueError:
                print("Invalid index. Please enter a number.")

        pprint(data)  # 打印更新后的数据结构
    
    return data

if __name__ == '__main__':
    file_path = 'example.json'  # 替换为你的 JSON 文件路径
    
    # 加载 JSON 文件
    data = load_json(file_path)
    if data is None:
        exit(1)
    
    # 编辑 JSON 数据
    edited_data = edit_json(data)
    
    # 保存修改后的 JSON 文件
    save_json(file_path, edited_data)

使用说明

  1. 加载 JSON 文件

    • 将你想要查看和编辑的 JSON 文件路径赋值给 file_path 变量。
    • 运行程序,它会读取并打印出 JSON 文件的内容。
  2. 编辑 JSON 数据

    • 根据提示输入你要编辑的键(如果是字典)或索引(如果是列表),然后输入新的值。
    • 如果你想结束编辑,请输入 done
  3. 保存 JSON 文件

    • 编辑完成后,程序会自动将更改保存回原始文件中。

示例 JSON 文件 (example.json)

为了演示这个程序的功能,这里提供一个简单的 JSON 文件内容示例:

{
    "name": "Alice",
    "age": 30,
    "is_student": false,
    "courses": ["Math", "Physics"],
    "address": {
        "street": "123 Main St",
        "city": "Wonderland"
    }
}

当你运行上述 Python 程序,并按照提示进行操作时,你可以查看这个 JSON 文件的内容,并对其进行编辑,比如修改 name 的值、添加新的课程到 courses 列表中,或者更改 address 下的信息等。最后,所有的更改都会被保存回到 example.json 文件中。

如果出现Error loading JSON file: Extra data: line 2 column 1 (char 4530)怎么办?

出现 Error loading JSON file: Extra data: line 2 column 1 (char 4530) 错误提示,通常意味着在解析 JSON 文件时遇到了多余的、未预期的数据。这可能是由于以下几种原因之一:

  1. 文件格式不正确:JSON 文件中可能包含了多于一个顶级对象或数组,或者有额外的字符(如注释、多余的逗号等)。

  2. 文件编码问题:如果文件包含非 UTF-8 编码的字符,可能会导致解析失败。

  3. 文件损坏:文件传输过程中可能出现错误,导致文件内容被破坏。

  4. 多余数据:文件中存在超出最后一个有效 JSON 对象之后的数据。

解决方法

1. 检查 JSON 文件格式

确保 JSON 文件只包含单个有效的 JSON 对象或数组。可以使用在线 JSON 验证工具(如 jsonlint.com)来检查和格式化 JSON 文件,以确定是否有格式上的错误。

2. 移除多余的数据

如果你确实需要存储多个 JSON 对象,考虑将它们放入一个数组中,或者每个对象保存为单独的文件。例如:

[
    {"name": "Alice", "age": 30},
    {"name": "Bob", "age": 25}
]

而不是:

{"name": "Alice", "age": 30}
{"name": "Bob", "age": 25}  // 这会导致 'Extra data' 错误
3. 检查文件编码

确保你的 JSON 文件是以 UTF-8 编码保存的,并且没有 BOM(字节顺序标记)。你可以使用文本编辑器(如 Notepad++ 或 VSCode)来更改文件编码。

4. 确认文件完整性

确保文件没有损坏,可以通过重新下载或生成文件来验证这一点。如果你是从网络上获取的文件,请尝试再次获取以确保完整性。

5. 修改 Python 代码以处理多个 JSON 对象

如果你必须处理包含多个独立 JSON 对象的文件,可以逐行读取文件并解析每一行作为单独的 JSON 对象。下面是一个示例代码片段:

import json

def load_multiple_json_objects(file_path):
    """
    从文件中加载多个 JSON 对象。
    
    :param file_path: 包含多个 JSON 对象的文件路径
    :return: 包含所有解析后的 JSON 对象的列表
    """
    objects = []
    with open(file_path, 'r', encoding='utf-8') as f:
        for line in f:
            try:
                obj = json.loads(line.strip())
                objects.append(obj)
            except json.JSONDecodeError as e:
                print(f"Error decoding JSON object: {e}")
                continue
    return objects

# 使用上述函数加载多个 JSON 对象
file_path = 'example.json'
objects = load_multiple_json_objects(file_path)
for obj in objects:
    pprint(obj)

这种方法假设每个 JSON 对象占一行,你可以解析出来然后按照标准的json格式存储。如果不是这种情况,你可能需要更复杂的逻辑来分割和解析文件内容。


http://www.kler.cn/a/472941.html

相关文章:

  • Perturbed-Attention Guidance(PAG) 笔记
  • 【Ubuntu】 Ubuntu22.04搭建NFS服务
  • Agent | Dify中的两种可选模式
  • 【Linux 之 二十 】使用 ln 命令创建符号链接
  • SpringBoot | 使用Apache POI库读取Excel文件介绍
  • Jenkins内修改allure报告名称
  • Swift语言的网络编程
  • cp命令详解
  • JAVA学习-练习试用Java实现“从用户输入获取一个字符串,并使用replace方法将字符串中的所有空格替换为下划线”
  • 深度学习中的卷积和反卷积(一)——卷积的介绍
  • client-go中watch机制的一些陷阱
  • EntityFrameworkCore 跟踪查询(Tracking Queries)
  • 转移指令jmp以及其他转移指令
  • 【Uniapp-Vue3】watch和watchEffect监听的使用
  • 分享一次面试经历
  • 缓存-Redis-API-Redission-自动续期-watch dog
  • 关于FPGA(现场可编程门阵列)工程技术人员的详细介绍
  • 2025最新解决方案:新买的mac鼠标和这个触控板反向
  • 『SQLite』更新和删除表记录
  • 开源靶场1
  • vscode 配置c/c++环境 中文乱码
  • Linux系统中解决端口占用问题
  • SpringBoot之核心配置
  • vs2022编译webrtc步骤
  • 搭建个人知识库,支持Word、PDF、txt等,一般电脑也能玩。
  • Vue3 el-tree-v2渲染慢的问题