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

Python读取json文件

文章目录

前言

 一、load 读取整个文件(常用):

 二、loads() 读取 JSON 字符串:

  三、 逐行读取大型 JSON 文件 (每一行都是一个 JSON 对象):

 四、处理包含多个json对象的文件:

 五、读取 JSON 文件中的特定字段 (使用 ijson):

总结


前言

在 Python 中,你可以使用json模块来读取 JSON 文件。在不同的应用场景,我们也有不同的读取方式,下面整理了一些常见的场景和特殊情况。


 一、load 读取整个文件(常用):

 我们先定义这样一个json文件,并将其命名为test.json:

{
    "name": "John",
    "age": 30,
    "city": "New York"
}

然后对其进行读取: 

import json

def load_json_data(filepath):
    try:   # 读取json文件
        with open(filepath, 'r', encoding='utf-8') as f:
            data = json.load(f)
        return data
    except (FileNotFoundError, json.JSONDecodeError) as e:    # 捕获异常
        print(f"Error: {e}")
        return None     
# 使用示例
data = load_json_data("test.json")#建议使用绝对路径来指定文件位置
if data:
    print(data)

输出结果为:

 


 二、loads() 读取 JSON 字符串:

import json

json_string = '{"name": "John", "age": 30, "city": "New York"}'
data = json.loads(json_string)
print(data)  # 输出结果为: {'name': 'John', 'age': 30, 'city': 'New York'}

  三、 逐行读取大型 JSON 文件 (每一行都是一个 JSON 对象):

先定义一个这样的json文件:

{"id": 1, "name": "Emma", "age": 25, "hobby": "reading"}
{"id": 2, "name": "Liam", "age": 30, "hobby": "swimming"}
{"id": 3, "name": "Olivia", "age": 22, "hobby": "painting"}
{"id": 4, "name": "Noah", "age": 28, "hobby": "playing football"}
{"id": 5, "name": "Ava", "age": 24, "hobby": "dancing"}
{"id": 6, "name": "William", "age": 32, "hobby": "cycling"}
{"id": 7, "name": "Isabella", "age": 26, "hobby": "cooking"}
{"id": 8, "name": "James", "age": 29, "hobby": "hiking"}
{"id": 9, "name": "Sophia", "age": 23, "hobby": "listening to music"}

对其进行读取:

import json

def process_large_json(filepath):
    with open(filepath, 'r', encoding='utf-8') as f:
        for line in f:
            try:
                data = json.loads(line.strip())  # 去除行尾空白符
                # 处理每一行数据...
                print(data)
            except json.JSONDecodeError as e:
                print(f"跳过无效 JSON 行:{e}")

# 使用示例
# 请根据实际情况修改文件路径
process_large_json("data.json")

输出结果:

 


 四、处理包含多个json对象的文件:

首先还是先定义json文档:

{
    "root": {
        "item": [
            {
                "id": 1,
                "name": "Alice",
                "age": 25
            },
            {
                "id": 2,
                "name": "Bob",
                "age": 30
            },
            {
                "id": 3,
                "name": "Charlie",
                "age": 35
            }
        ]
    }
}

 进行读取:

import ijson

def parse_nested_json(filepath):
    with open(filepath, 'r', encoding='utf-8') as f:
        for item in ijson.items(f, 'root.item'):  # 假设根下有 "item" 数组
            print(item)

# 使用示例
parse_nested_json("data.json")

输出结果:


 五、读取 JSON 文件中的特定字段 (使用 ijson):

还是用刚才的那个json文件,只不过改变了读取方式

import ijson

def extract_field(filepath, field_name):
    # 以二进制模式 'rb' 打开指定路径的 JSON 文件
    # 对于 ijson 来说,使用二进制模式更高效
    with open(filepath, 'rb') as f:
        # 使用 ijson.parse 方法对文件对象进行流式解析
        # 该方法会逐行解析 JSON 文件,并返回三元组 (prefix, event, value)
        # prefix 表示当前解析位置的路径前缀
        # event 表示当前解析的事件类型,如 'string', 'number', 'start_array' 等
        # value 表示当前解析的值
        for prefix, event, value in ijson.parse(f):
            # 检查 prefix 是否以指定的 field_name 结尾
            # 并且 event 是表示基本数据类型的事件,如字符串、数字、布尔值
            # 这样可以确保我们提取的是所需字段的有效数据
            if prefix.endswith(field_name) and event in ('string', 'number', 'boolean'):
                # 如果满足条件,则打印出该字段的值
                print(value)

# 使用示例: 提取 "name" 字段
# 调用 extract_field 函数,传入 JSON 文件路径和要提取的字段名
extract_field("data.json", "name")

输出结果:

 


总结


       以上就是今天要讲的内容,本文仅仅简单介绍了几种读取json文件的方法。选择哪种方法取决于你的具体情况,例如文件大小,JSON 结构以及你想要如何处理数据。 记住处理异常,并根据需要指定编码。

感谢阅读,希望能对你有所帮助~

制作不易,能否给个三连支持一下~


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

相关文章:

  • PHP:phpstudy无法启动MySQL服务问题解决
  • 力扣-动态规划-496 下一个更大的元素Ⅰ
  • VSCode 配置优化指南
  • Docker和DockerCompose基础教程及安装教程
  • 刷题记录(LeetCode605 种花问题)
  • C语言(队列)
  • 基于大数据的全国地铁数据可视化分析系统
  • 在人工智能软件的帮助下学习编程实例
  • Helm安装chart包到k8s报错“不能重复使用名称,名称已被使用”
  • FPGA 的 LBC 总线详解
  • HttpServlet源码分析与Servlet开发最佳实践
  • 初阶数据结构(C语言实现)——4.1栈
  • QT---鼠标事件
  • 【网络】HTTP协议、HTTPS协议
  • 模拟调制技术详解
  • 顶点着色器和片段着色器
  • 无人机推流/RTMP视频推拉流:EasyDSS无法卸载软件的原因及解决方法
  • Android AudioFlinger(四)—— 揭开PlaybackThread面纱
  • react脚手架(creat-react-app)
  • 大数定律详解