Python读写JSON格式数据

2023-05-16

文章目录

  • JSON格式数据简介
  • 使用Python读写JSON格式数据
    • 1.读取json文件
    • 2.写入json文件
  • 自己编写一个JsonUtils

JSON格式数据简介

JSON文件的读写应算成Python基础知识的内容,但是由于在编写Nonebot插件时,常常会操作JSON类型的数据,今天就回顾一下Python操作JSON。

JSON 全称“JavaScript Object Notation”,译为“JavaScript 对象简谱”或“JavaScript 对象表示法”,是一种轻量级的、基于文本的、开放的数据交换格式。JSON 在 Web 开发领域有着举足轻重的地位,如果您想在 Web 开发领域大展身手的话,就必须了解 JSON。通俗点来说Json是一种文本格式,常用于数据存储。基本结构为键: 值,键仅可以为字符串,而值可以是字符串,列表,数字,或者另一些键值对
下面这段数据很好的展示了不同形式的Json结构:

{
    "max": 1,
    "1": {
        "user": 825882638,
        "type": "image"
        "title": "超人"
    },
    "a": [
        "芝麻开门",
        {
            "a": 2
        },
        "b"
    ],
    "c": {
        "d": 888
        "g": 888
    }
}

注意:所有Json文本最外层都必须有{}

使用Python读写JSON格式数据

接下来我们就以上面这个Json文本为样板讲解一下Json文件的解析。

在Python当中,如果我们要解析Json文件,就必须先导入Python安装时自带的json库,即import json,之后才可以进行json操作。

1.读取json文件

下面的代码告诉了我们如何读入一个json文件

with open("./new.json", "r", encoding="utf-8") as f:
    content = json.load(f)

json.load是直接从文件读取json文本,而json.loads是读取进行了json编码的文本而非本地文件。

上述代码即从当前目录下的"new.json"文件当中读入json数据,随后json.load方法会将读入的json文本转换成Python当中的字典存入content变量当中。而在Python中操作JSON格式数据实际上就是操作字典、列表所组成的组合数据类型。

例如我们现在想要在上面的json文本当中提取最下面的"d"的值(代码中1号位置),可以这么操作val=content[“c”][“d”],这样就可以取到d的值,也就是333了。除此之外上例我们还可以看到[]包裹的列表,如果我们想取到其中的"a"(代码中2号位置)的值,应该这么写:val=content[“a”][1][“a”],此时val的值为2

2.写入json文件

with open("./new.json", "w", encoding="utf-8") as f:
    json.dump(data, f, indent=4, ensure_ascii=False)

上述代码用于向json文件当中写入data数据,其中dump方法拥有很多参数,这里只讲上面代码中的三个,其他的请自行查阅。

obj:即上述第一个参数,用于传入需要写入Json文件当中的数据。

fp:即上述第二个参数,用于传入需要写入Json数据的文本指针

indent:传入Json文件换行缩进量,一般为2或者4。

ensure_ascii:是否允许Ascii码。若为True(默认),则输入的中文全会转化为\uXXXX存储。

自己编写一个JsonUtils

代码来源于github上一个大佬,如何使用的话代码注释给出了详细说明!如果对此方面比较感兴趣可以去瞧瞧大佬!点击去见大佬

import json, os

class JsonUtils():
    relative_url = "./data/"
    abstract_url = "file:///home/ubuntu/qqbot/data/rpg/"

    @staticmethod
    def __preBuildFile(file: str, *default: Union[str, dict]) -> bool:
        """
        判断文件及路径是否存在,若不存在则创建并生成对应文件内容

        :param file: 文件路径
        :param default: 默认文件内容
        :return:
        """
        if (not os.path.exists(file)):
            path = os.path.split(file)
            if (not os.path.exists(path[0])):
                os.mkdir(path[0])
            with open(file, "w", encoding=utf-8") as f:
                if (default):
                    arg = default[0]
                    if (isinstance(arg, str)):
                        f.write(arg)
                    elif (isinstance(arg, dict)):
                        try:
                            js = json.dumps(arg, indent=4, ensure_ascii=False)
                            f.write(js)
                        except json.JSONEncoder:
                            return False
                    else:
                        f.write(str(arg))
                else:
                    f.write("")
        return True
                      
    @classmethod
    async def read(cls, filename: str, *default) -> Tuple[dict, bool]:
        """
        读取指定json文件

        :param filename: 文件路径
        :param default: 若无此文件,创建该文件时写入的内容
        :return: [读取到的内容, 是否为新创建的文件]
        """
        file_url = cls.relative_url + filename
        if (default):
            res = JsonUtils.__preBuildFile(file_url, default[0])
        else:
            res = JsonUtils.__preBuildFile(file_url)
        with open(file_url, "r", encoding="utf-8") as f:
            content = json.load(f)
        return (content, res)

    @classmethod
    async def write(cls, filename: str, data: dict) -> None:
        """
        写入Json数据
        
        :param filename: 文件路径
        :param data: 写入的数据
        :return: 
        """
        file_url = cls.relative_url + filename
        JsonUtils.__preBuildFile(file_url)
        with open(file_url, "w", encoding="utf-8") as f:
            content = json.dumps(data, indent=4, ensure_ascii=False)
            f.write(content)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python读写JSON格式数据 的相关文章

  • 如何在 select 和 option 标签中添加 JSON 数据?

    我有这个html代码 div class searchfilter div class searchwrapper div div
  • 来自 iPhone/iPad 的 json Web 服务

    有人可以帮助我解决如何从 iphone 或 ipad 使用 json Web 服务的问题吗 这里我的要求是使用 API 密钥实现 json webservice 如果可能的话发布一些教程或示例链接 谢谢 规范的 JSON 处理库是here
  • 您可以格式化 pandas 整数以进行显示,例如浮点数的“pd.options.display.float_format”?

    我见过this https stackoverflow com questions 18404946 py pandas formatdataframe and this https stackoverflow com questions
  • YOLOv8获取预测边界框

    我想将 OpenCV 与 YOLOv8 集成ultralytics 所以我想从模型预测中获取边界框坐标 我该怎么做呢 from ultralytics import YOLO import cv2 model YOLO yolov8n pt
  • 使用 xlrd 打开 BytesIO (xlsx)

    我正在使用 Django 需要读取上传的 xlsx 文件的工作表和单元格 使用 xlrd 应该可以 但因为文件必须保留在内存中并且可能不会保存到我不知道如何继续的位置 本例中的起点是一个带有上传输入和提交按钮的网页 提交后 文件被捕获req
  • 为什么 PyYAML 花费这么多时间来解析 YAML 文件?

    我正在解析一个大约 6500 行的 YAML 文件 格式如下 foo1 bar1 blah name john age 123 metadata whatever1 whatever whatever2 whatever stuff thi
  • Python beautifulsoup 仅限 1 级文本

    我看过其他 beautifulsoup 得到相同级别类型的问题 看来我的有点不同 这是网站 我正试图拿到右边那张桌子 请注意表的第一行如何展开为该数据的详细细分 我不想要那个数据 我只想要最顶层的数据 您还可以看到其他行也可以展开 但在本例
  • 在Python中检索PostgreSQL数据库的新记录

    在数据库表中 第二列和第三列有数字 将会不断添加新行 每次 每当数据库表中添加新行时 python 都需要不断检查它们 当 sql 表中收到的新行数低于 105 时 python 应打印一条通知消息 警告 数量已降至 105 以下 另一方面
  • 如何使用python在一个文件中写入多行

    如果我知道要写多少行 我就知道如何将多行写入一个文件 但是 当我想写多行时 问题就出现了 但是 我不知道它们会是多少 我正在开发一个应用程序 它从网站上抓取并将结果的链接存储在文本文件中 但是 我们不知道它会回复多少行 我的代码现在如下 r
  • javascript 是否有等效的 __repr__ ?

    我最接近Python的东西repr这是 function User name password this name name this password password User prototype toString function r
  • 不同编程语言中的浮点数学

    我知道浮点数学充其量可能是丑陋的 但我想知道是否有人可以解释以下怪癖 在大多数编程语言中 我测试了 0 4 到 0 2 的加法会产生轻微的错误 而 0 4 0 1 0 1 则不会产生错误 两者计算不平等的原因是什么 在各自的编程语言中可以采
  • 仅第一个加载的 Django 站点有效

    我最近向 stackoverflow 提交了一个问题 标题为使用mod wsgi在apache上多次请求后Django无限加载 https stackoverflow com questions 71705909 django infini
  • 使用特定颜色和抖动在箱形图上绘制数据点

    我有一个plotly graph objects Box图 我显示了箱形 图中的所有点 我需要根据数据的属性为标记着色 如下所示 我还想抖动这些点 下面未显示 Using Box我可以绘制点并抖动它们 但我不认为我可以给它们着色 fig a
  • 如何使用原始 SQL 查询实现搜索功能

    我正在创建一个由 CS50 的网络系列指导的应用程序 这要求我仅使用原始 SQL 查询而不是 ORM 我正在尝试创建一个搜索功能 用户可以在其中查找存储在数据库中的书籍列表 我希望他们能够查询 书籍 表中的 ISBN 标题 作者列 目前 它
  • 如何在 Windows 命令行中使用参数运行 Python 脚本

    这是我的蟒蛇hello py script def hello a b print hello and that s your sum sum a b print sum import sys if name main hello sys
  • 如何在 pygtk 中创建新信号

    我创建了一个 python 对象 但我想在它上面发送信号 我让它继承自 gobject GObject 但似乎没有任何方法可以在我的对象上创建新信号 您还可以在类定义中定义信号 class MyGObjectClass gobject GO
  • 将 Python 中的日期与日期时间进行比较

    所以我有一个日期列表 datetime date 2013 7 9 datetime date 2013 7 12 datetime date 2013 7 15 datetime date 2013 7 18 datetime date
  • Scipy Sparse:SciPy/NumPy 更新后出现奇异矩阵警告

    我的问题是由大型电阻器系统的节点分析产生的 我基本上是在设置一个大的稀疏矩阵A 我的解向量b 我正在尝试求解线性方程A x b 为了做到这一点 我正在使用scipy sparse linalg spsolve method 直到最近 一切都
  • 在 JavaScript 函数的 Django 模板中转义字符串参数

    我有一个 JavaScript 函数 它返回一组对象 return Func id name 例如 我在传递包含引号的字符串时遇到问题 Dr Seuss ABC BOOk 是无效语法 I tried name safe 但无济于事 有什么解
  • 使用随机放置的 NaN 创建示例 numpy 数组

    出于测试目的 我想创建一个M by Nnumpy 数组与c随机放置的 NaN import numpy as np M 10 N 5 c 15 A np random randn M N A mask np nan 我在创建时遇到问题mas

随机推荐

  • win10安装wsl2

    一 环境准备 1 确保bios开启虚拟化支持 各品牌主板进入bios的方式可百度或看主板说明书 2 查看当前win10版本是不是最新版 xff0c 如果不是则升级到最新版 查看当前版本 xff0c win 43 r打开运行窗口输入 34 w
  • snprintf 函数用法心得

    前人挖坑 xff0c 后人种树 不能对同一段内存 xff08 同一个buf 或是两个重叠的内存使用snprintf xff0c 换句等方面说 xff0c 在使用snprintf 时 xff0c 就确保内存不重叠 先来看看一段问题代码的执行结
  • VMware改变虚拟机文件在真实机的位置2208262201

    VMware 改变虚拟机文件位置 1 查看打开i虚拟机文件目录2 关闭虚拟机 将虚拟机文件夹复制或剪切到想要的位置3 用VMware打开复制的文件夹下的 vmx 文件 生成一个新的同名的虚拟机4 开启这个新生成的虚拟机 出现对话框选择意图
  • Ubuntu22.04.01Desktop桌面版 允许root用户远程登陆 笔记221110

    先给root设置密码 span class token function sudo span span class token function passwd span root 启用远程密码登录 和允许root远程ssh登陆 进入 etc
  • MySQL8 创建用户,设置修改密码,授权

    MySQL8 创建用户 设置修改密码 授权 MySQL5 7可以 创建用户 设置密码 授权 一步到位 x1f447 span class token keyword GRANT span span class token keyword A
  • win10远程桌面AlmaLinux9.1,用xrdp

    win10远程桌面AlmaLinux9 1 用xrdp 默认 yum 和 dnf 都下载不到 xrdp 要先 install epel release 安装EPEL源 span class token function sudo span
  • Rocky9.1安装xrdp远程桌面 230315

    Rocky9 1安装xrdp远程桌面 230315 要先 install epel release 安装EPEL源 span class token function sudo span yum span class token funct
  • DNS默认的端口号是: 53

    DNS默认的端口号是 53 DNS 域名系统 主机命名系统 DNS 是 Domain Name System 的缩写 DNS协议运行在UDP协议之上 xff0c 使用端口号53
  • 【pandas】在Pandas中降低dataframe使用的内存

    想要降低dataframe的内存占用主要有两种方法 使用小一点的数值型 datatype把object类型的列转为categorical类型 df span class token operator 61 span pd span clas
  • 第一次ubuntu wsl ssh远程登录各种报错+解决

    首先将ssh默认的22端口改了 xff0c 以防端口被占用冲突 xff0c 这里我改为2222 xff08 感觉这步其实可有可无 xff09 sudo sed span class token operator span i span cl
  • 自适应分级轮询超时机制

    自适应分级轮询超时机制 超时概念实现原理基础 xff1a 目标 xff1a 实现 xff1a 示例 xff1a 超时概念 程序运行中 xff0c 操作后需要等待某个状态 xff0c 正常返回 xff0c 但实际未按预期状态出现 xff0c
  • 惠普hp战66拆机(含主板)

    惠普hp战66拆机 含主板 1 拧螺丝 红色箭头处螺丝不用完全卸下 xff0c 只需拧松到适当 无外旋趋势 xff0c 总共5颗 红色椭圆出螺丝需完全卸下 xff0c 总共两颗 2 撬后盖 从网口处插入撬杆 xff0c 因为就这里缝隙大一些
  • 将两块球形橡皮泥揉在一起,捏成一个正方体。请编程,完成下述功能:从键盘读入2个球形橡皮泥的直径,直径为浮点数;求正方体的边长,并保留两位小数输出;

    化球为正方体 作者 xff1a c 43 43 课程组 单位 xff1a 湖州师范学院 输入格式 第一个球的直径 第二个球的直径 中间用一个空格隔开 输出格式 输出正方体的边长 xff0c 并保留两位小数输出 具体格式见样例 样例 34 g
  • Ubuntu下WIFI不稳定问题

    初步尝试 Ubuntu下无线网络总是不稳定 xff0c 显示WIFI开着 xff0c 密码也正确 xff0c 但是连接时却一直连不上 xff0c 显示一直connecting xff0c 建立WIFI连接时可以看到有如下syslog xff
  • 树莓派:64位 RPI OS(Bullseye) 更换国内源

    树莓派装好后第一件事通常是先apt update和apt upgrade xff0c 默认需要联到树莓派官方的服务器上下载更新 我不知道各位的联网情况如何 xff0c 反正我家里电信网络是龟速 xff0c 慢到忍者神龟都不能忍的那种 xff
  • 树莓派OS:2022-04-04版的Headless设置方法

    Raspberry Pi OS 2022 04 04版增加了一个特性 xff1a 取消了祖传的默认用户 pi 当你刷完镜像首次使用的时候 xff0c 会先跳出来一个界面让你指定用户名和密码 xff0c 无论是桌面版还是Lite版 显然这是一
  • 树莓派:安装WordPress

    之前尝试了在树莓派OS下安装Discuz 成功 xff0c 今天再试下安装WordPress 过程差不多 xff0c 毕竟都是基于LAMP的应用 一 安装操作系统 xff1a 1 刷卡灌系统略 我选择64位的系统 注意自2022 04 04
  • 树莓派:解决4B升级到Bullseye后xrdp不响应的问题

    相较于VNC xff0c 我更喜欢RDP xff0c 因为偷懒更容易 xff0c 在Windows里直接mstsc v IP地址 即可启动远程桌面 所以玩树莓派也一样 xff0c 如果装了桌面版的RPI OS xff0c 那么一定sudo
  • 不忘初心,能偷懒就偷懒:C#操作Word文件

    换了一家公司 xff0c 新单位的信息化建设仍然在路上 OA也正在建设中 xff0c 目前项目发票报销等流程仍然是手工的 xff0c 只能线下填单子 至于是电脑上填好打印出来还是直接空白模板打出来手写倒是不管 xff0c 随意 疫情期间积压
  • Python读写JSON格式数据

    文章目录 JSON格式数据简介使用Python读写JSON格式数据1 读取json文件2 写入json文件 自己编写一个JsonUtils JSON格式数据简介 JSON文件的读写应算成Python基础知识的内容 xff0c 但是由于在编写