首页 > 编程语言 >Python | json文件和jsonl文件

Python | json文件和jsonl文件

时间:2024-02-01 15:45:33浏览次数:40  
标签:文件 jsonl Python JSONL JSON 对象 json

Python | json文件和jsonl文件

JSON 文件是使用 JSON(JavaScript Object Notation)格式存储数据的文件。它是一种结构化的文本格式,使用键值对的方式表示数据。 JSON 文件通常包含一个根对象,可以包含多个嵌套的对象、数组和基本数据类型。

JSONL 文件(JSON Lines),则是一种每行包含一个独立的 JSON 对象的文本文件格式。 每行都是一个有效的 JSON 对象,和json的"list dict"不一样,jsonl的话没有"list",只有一行行的“dict”,使用换行符分隔。相比于 JSON 文件,JSONL 文件更加轻量,每行为独立的 JSON 对象,没有逗号或其他分隔符。这样的好处是方便一行行读取,而不用像json一样只能一次性把"list"里面的"dict”全部都读出来,节省了内存吧,并且还能增加可读性,普通的json文件打开之后会乱糟糟一团。

jsonl的话需要pip安装一个jsonlines包。

JSON文件的内容示例:

[{"name": "John", "age": 30},
{"name": "Jane", "age": 25},
{"name": "Bob", "age": 40}]

JSONL文件的内容示例:

{"name": "John", "age": 30}
{"name": "Jane", "age": 25}
{"name": "Bob", "age": 40}

主要区别如下:
JSON 文件:

  • 使用大括号 {} 表示对象,使用方括号 [] 表示数组。
  • 整个文件是一个有效的 JSON 对象或数组。
  • 适合存储结构化的数据,如配置文件、API 响应等。
  • 一次性读取整个文件,解析成一个 JSON 对象,可以随机访问其中的数据。

JSONL 文件:

  • 每行是一个独立的有效 JSON 对象。
  • 每行之间没有逗号或其他分隔符。
  • 适合存储每行为独立记录的数据,如日志、传感器数据、日志行等。
  • 逐行读取文件,逐行解析 JSON 对象,一次处理一行的数据。

JSONL 文件适合用于以下情况:

  • 当数据以行为单位独立存储,并且每行数据之间没有明确的分隔符时。
  • 当需要逐行处理数据,以节省内存和提高处理速度时。
  • 当数据量非常大,无法一次性加载到内存中时,JSONL 格式提供了一种流式处理数据的方式。

这么对比下来,JSON 文件更适合结构化的数据存储和传输,而 JSONL 文件更适合每行为独立记录的数据存储和处理。

json文件转为jsonlines

import jsonlines
import json

with jsonlines.open(write_path, "w") as wfd:
    with open(read_path, "r", encoding='utf-8') as rfd:
        for data in rfd:
            data = json.loads(data)#注意,这里json文件格式不同,写法也不同,具体看文件,,注意区别json.load()与json.loads()
            wfd.write(data)

jsonlines转为json文件(原因是jsonlines虽然好用,但并未通用,很多配置文件等都用的json格式)

import jsonlines
import json

with jsonlines.open(read_path, "r") as rfd:
    with open(write_path, "w", encoding='utf-8') as wfd:
        for data in rfd:
            json.dump(data, wfd, indent=4, ensure_ascii=False)

python如何读取jsonl文件:

import json

jsonl_file = "data.jsonl"

with open(jsonl_file, "r") as file:
    for line in file:
        json_obj = json.loads(line)
        # 对 JSON 对象进行处理
        print(json_obj["name"], json_obj["age"])

使用 ijson 库用于流式处理 JSONL 文件

请注意,在处理大型 JSONL 文件时,可以使用适当的技术和库进行优化,例如流式处理或批量处理,以减少内存占用和提高性能。这取决于数据量和具体的处理需求。

ijson 是一个流式处理 JSON 数据的 Python 库,它可以有效地处理大型 JSONL 文件。下面是一个示例代码,展示了如何使用 ijson 库来处理 JSONL 文件:

import ijson

jsonl_file = "data.jsonl"

with open(jsonl_file, "rb") as file:
    # 使用 ijson.items 函数读取 JSONL 文件中的每个 JSON 对象
    for json_obj in ijson.items(file, "item"):
        # 在这里处理 JSON 对象
        print(json_obj)

在示例代码中,我们首先使用 open 函数打开 JSONL 文件,并以二进制模式打开文件。然后,我们使用 ijson.items 函数来读取 JSONL 文件中的每个 JSON 对象。第一个参数是打开的文件对象,第二个参数是 JSON 对象的路径。在这个示例中,我们假设每个 JSON 对象的键是 “item”。

在循环内部,你可以根据需要对每个 JSON 对象进行处理。json_obj 是一个 Python 字典,表示当前行的 JSON 对象。

ijson 库的优势在于它以迭代的方式逐行读取 JSONL 文件,并在需要时按需解析 JSON 对象。这样可以大大减少内存的占用,并且适用于处理非常大的 JSONL 文件。

https://www.cnblogs.com/zhangxuegold/p/17537565.html

标签:文件,jsonl,Python,JSONL,JSON,对象,json
From: https://www.cnblogs.com/michaelcjl/p/18001404

相关文章

  • linux 之 shell脚本实现SFTP下载、上传文件、执行sftp命令
    需求需求方通过sftp不定时的上传一批用户(SBXDS_ACC_M_任务ID_yyyymmddHHMMSS.csv),需要我们从这些用户中找出满足条件的用户。然后把这些结果用户通过文件的形式上传到ftp。环境说明ip1能连接hive库环境,不能连接sftp。ip2不能连接hive库环境,能连接sftp。ip1和ip2是共享盘,能同时......
  • 文件链接如何进行下载
    第一种Content-DispositionContent-disposition是MIME协议的扩展,MIME协议指示MIME用户代理如何显示附加的文件。当浏览器接收到头时,他会激活文件下载对话框,它的文件名框自动填充headers指定的文件名。服务器向浏览器发送文件时,如果是浏览器支持的文件类型,一般会默认使用浏览器......
  • python提取PDF中表格数据到数据库
    工作中遇到的问题:需要从PDF中提取表格数据,并数据落到MySQL库中。具体情况如下图所示:目录页:代码数据页:使用python实现代码如下(水平有限,此代码仅供自用):importpdfplumberpdf=r'XXX.pdf'wookroot=pdfplumber.open(pdf)pages=wookroot.pagestable_text=''forpage......
  • pyqt报错、python报错:src/pyaudio/device_api.c:9:10: fatal error: portaudio.h: 没
    报错信息:-DNDEBUG-fwrapv-O2-Wall-fPIC-O2-isystem/home/devil/anaconda3/envs/91/include-fPIC-O2-isystem/home/devil/anaconda3/envs/91/include-fPIC-I/usr/local/include-I/usr/include-I/home/devil/anaconda3/envs/91/include/python3.10-csrc/pyaudio......
  • 从网络上下载文件到本地
    1packagecom.example.demo.controller;23importlombok.extern.slf4j.Slf4j;4importorg.springframework.http.MediaType;5importorg.springframework.stereotype.Controller;6importorg.springframework.util.FileCopyUtils;7importorg.springframe......
  • linux c++读写ini文件,不是用boost
    摘自:https://linuxcpp.0voice.com/?id=65276可以使用标准库中的fstream和string类来读写ini文件。以下是一个示例代码:#include<iostream>#include<fstream>#include<sstream>#include<map>usingnamespacestd;//解析ini文件,返回一个键值对的mapmap<string,string......
  • Python实现学生信息管理系统
    学生信息管理系统系统设计系统功能结构 录入学生信息模块查找学生信息模块删除学生信息模块修改学生信息模块学生成绩排名模块统计学生总人数模块显示全部学生信息模块系统业务流程 用户->主界面->功能菜单->选择功能->是否为0->y->结束程序主函数设计 主函数的业务......
  • Python时间序列分析苹果股票数据:分解、平稳性检验、滤波器、滑动窗口平滑、移动平均、
    全文链接:https://tecdat.cn/?p=33550原文出处:拓端数据部落公众号什么是时间序列?时间序列是一系列按时间顺序排列的观测数据。数据序列可以是等间隔的,具有特定频率,也可以是不规则间隔的,比如电话通话记录。在进行投资和交易研究时,对于时间序列数据及其操作要有专业的理解。本文......
  • jmeter Regular Expression Extractor和JSON Extractor使用
    在Jmete中我们经常遇到需要把当前接口返回内容用于下一个接口请求,应用场景:登录接口返回的cookie或者token等,下面就简单描述一下两种提取器的使用和需要注意的事项:1、RegularExpressionExtractorApplyto:待研究;Fieldtocheck:取值的地方,ReferenceName:取得值后存放值的变量......
  • 解决前端JSZip读取压缩包内文件中文名称乱码问题
    1importJSZipfrom"jszip";23functionjszipFile(file){4if(!/\.zip$/i.test(file.name)){5reject(`文件"${file.name}"不是zip文件`);6return;7}89constfileReader=newFileReader();1011//转换文件为Arra......