(最新亲测有效)python中操作json文件追加数据

一、前言

        最近想用json存储接口关联的变量数据,查了一下网上许多伙伴的文章,最后总是某个地方容易报错。最后发现还是大部分网友摘抄别人的细节问题,所以自己记录一下。

二、操作流程

        这里我也是初学者自学,暂时了解到的一些内容,想先让大家清楚一下,首先python中对文件操作的模式中(r、w、a、rb、r+等等),其实默认情况下是无法直接对json文件进行追加的操作,因为json具备有固定的json格式,常用文件操作模式中,追加模式的指针会放置于文件内容的开头或者末尾,也就是会破坏json格式!

        所以,很好理解了,所谓的json文件数据的追加,其实最终是通过先加载文件内容,存入给一个对象,然后在对象中追加或更新数据,最后,把这个最新的对象,覆盖掉原有json文件,就是这么个原理。

        那么,你的操作就很简单:

1、先判断目录与文件是否存在

初学者对于文件操作很多时候不够仔细,因为我们需要做的是追加数据,但是有时候,文件在实际项目中是可能被清理掉的,所以第一步其实应该是先判断是否存在目录以及文件。

        # 切割字符串判断路径是否存在,不存在则创建data_dir = path.rsplit("/", 1)[0]if not os.path.isdir(data_dir):os.mkdir(data_dir)# 然后判断该目录下文件是否存在,否则创建f = open(path, "w", encoding="utf-8")f.close()

2、读取json文件,把所有值取出放到自定义的字典对象中

        # 读取json文件的所有内容,如果文件为空则赋予{}json格式with open(path, "r", encoding="utf-8") as f:if os.path.isfile(path):size = os.path.getsize(TestAll.path)if size == 0:content = {}else:content = json.load(f)else:content = {}f.close()

3、通过python中字典自带的update方法,更新或添加对象

        token = {"key1": "value2"}content.update(token)

update方法会针对字典中具备的元素key执行更新,不具备的元素执行插入!

4、覆盖保存最新的json对象到该文件中

        with open(path, "w", encoding="utf-8") as f_new:json.dump(content, f_new, ensure_ascii=False, indent=4)f.close()

网上的小伙伴基本没仔细说明这个操作其实是覆盖操作,所以真正的json追加数据其实并不存在,都是通过取出json所有值,然后通过python的字典操作方法update方法,去更新一遍json对象,然后最终用新json对象,覆盖旧的对象写入了文件中。

三、全部代码:

class TestAll:path = "D:/..路径使用你自己的路径.../all_file/data.json"def test(self, path):# 切割字符串判断路径是否存在,不存在则创建data_dir = path.rsplit("/", 1)[0]if not os.path.isdir(data_dir):os.mkdir(data_dir)# 然后判断该目录下文件是否存在,否则创建f = open(path, "w", encoding="utf-8")f.close()# 读取json文件的所有内容,如果文件为空则赋予{}json格式with open(path, "r", encoding="utf-8") as f:if os.path.isfile(path):size = os.path.getsize(TestAll.path)if size == 0:content = {}else:content = json.load(f)else:content = {}f.close()token = {"key1": "value2"}content.update(token)with open(path, "w", encoding="utf-8") as f_new:json.dump(content, f_new, ensure_ascii=False, indent=4)f.close()if __name__ == '__main__':TestAll().test(TestAll.path)

需要注意点:

1、注意路径使用你自己的,通常我们真正的实际项目中,操作的路径建议是绝对路径;

2、上面的代码是可以再细化的,看你个人,比如可以再增加路径转换(windows与苹果系统路径的格式不一致),python中建议使用的路径分隔符是“/”,否则容易出错,转义其实挺麻烦的。

3、可以使用try except去捕获异常进行异常方式的处理。

上面的代码完成结果应该是,如果你的目录不存在,文件不存在,会进行自动创建然后写入,如果存在了,则达成一个追加更新的效果,不会覆盖旧数据,有问题欢迎留言。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/47932.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STM32 产生Hard Fault 调试方法

STM32 产生hard-fault 调试方法 当STM32 产生Hard Fault的时候可以打印出一些重要的寄存器信息,然后定位代码出错的地方。 https://github.com/ferenc-nemeth/arm-hard-fault-handler 下面是核心代码。 void HardFault_Handler(void) {__asm volatile("TST …

全面了解不同GPU算力型号的价格!

这两年人工智能(AI)、机器学习(ML)、深度学习和高性能计算(HPC)领域的快速发展,GPU算力已成为不可或缺的资源。企业、研究机构乃至个人开发者越来越依赖于GPU加速计算来处理大规模数据集和复杂模…

如何将大模型应用到自己的业务中?7种大模型应用方式和代表论文总结

如何将大模型应用落地到自己的业务或工作中?这篇文章整理了7种目前业内最常用的大模型应用方法,以及各个方法的代表论文。通过对各种应用大模型方法的特点对比,找到最适合自己场景的应用方法。 1 Pretrain-Finetune 直接针对下游任务进行全…

Linux介绍和文件管理

一Linux的起源 1.Unix Dennis Ritchie和Ken Thompson发明了C语言,而后写出了Unix的内核 2.Minix MINIX是一种基于微 内核架构的类UNIX计算机操作系统,由 Andrew S. Tanenbaum发明 3.Linux内核 芬兰赫尔辛基大学的研究生Linus Torvalds基于Gcc、 ba…

分布式存储之 ceph 管理操作

一.资源池 Pool 管理 我们已经完成了 Ceph 集群的部署,但是我们如何向 Ceph 中存储数据呢?首先我们需要在 Ceph 中定义一个 Pool 资源池。Pool 是 Ceph 中存储 Object 对象抽象概念。我们可以将其理解为 Ceph 存储上划分的逻辑分区,Pool 由…

ELK日志收集

一、什么是ELK ELK 是由 Elasticsearch、Logstash、Kibana 三个开源软件的组成的一个组合体,ELK 是 elastic 公司研发的一套完整的日志收集、分析和展示的企业级解决方案。 ELK 的好处: ELK 组件在大数据运维系统中,主要可解决的问题如下&…

适用于 Android 的恢复应用程序合集分享

丢失重要文件或数据从来都不是一件有趣的事。这种情况可能发生在您的计算机和笔记本电脑上,也可能发生在您的 Android 智能手机或平板电脑上。然而,尽管 Android 用户可能认为在这种情况下他们可用的选择较少,但用于 Android 数据恢复的应用程…

自定义注解 + Redis 实现业务的幂等性

1.实现幂等性思路 实现幂等性有两种方式: ⭐ 1. 在数据库层面进行幂等性处理(数据库添加唯一约束). 例如:新增用户幂等性处理,username 字段可以添加唯一约束. ⭐ 2. 在应用程序层面进行幂等性处理. 而在应用程序…

C#医学影像管理系统源码(VS2013)

目录 一、概述 二、系统功能 系统维护 工作站 三、功能介绍 影像采集 统计模块 专业阅片 采集诊断报告 报告管理 一、概述 医学影像存储与传输系统(PACS)是一种集成了影像存储、传输、管理和诊断功能的系统。它基于数字化成像技术、计算机技术和…

大模型+编程,未来程序员躺平还是失业?

自然语言大模型编程可以更好地理解用户的需求,然后输出对应代码。 最近英伟达让AI自动写代码的开源神器已上线,Nvidia推出了Code Llama在线体验页面,Code Llama 是 Llama 2 的代码专用版本,无需注册,无需本地部署&…

Jangow

关于靶场环境配置,确实这个靶场存在很大的问题,不仅仅是网络的配置问题,更重要的是明知道如何修改网络环境配置,但是键盘存在很大的问题。许多字符输入不一致。 Vulnhub靶场,Jangow靶机环境找不到ip解决方法。_jangow…

基于springboot新生宿舍管理系统

系统背景 在当今高等教育日益普及的时代背景下,高校作为知识传播与创新的重要基地,其基础设施的智能化管理显得尤为重要。新生宿舍作为大学生活的起点,不仅是学生日常生活与学习的重要场所,也是培养学生独立生活能力和团队合作精神…

hive动态分区导致xceivercount超限,hdfs无法创建新连接

目录 一、事件复盘: 二、解决方案: 三、讨论 一、事件复盘: hdfs无法创建新的文件,xceivercount超过最大设置,平时每个datanode只有100个左右的连接,突然达到8000以上。 事故原因,跨多天的…

学懂C语言(八):深入理解 register 寄存器的含义

寄存器是计算机处理器内部非常快速的一种存储设备。与普通的内存(RAM)相比,处理器访问寄存器的速度要快得多,因为它们位于处理器内部,而不是通过系统总线外部访问。这种速度优势使得寄存器非常适合用来存储那些需要频繁…

Ubuntu 24.04 LTS 桌面安装MT4或MT5 (MetaTrader)教程

运行脚本即可在 Ubuntu 24.04 LTS Noble Linux 上轻松安装 MetaTrader 5 或 4 应用程序,使用 WineHQ 进行外汇交易。 MetaTrader 4 (MT4) 或 MetaTrader 5 是用于交易外汇对和商品的流行平台。它支持各种外汇经纪商、内置价格分析工具以及通过专家顾问 (EA) 进行自…

架构以及架构中的组件

架构以及架构中的组件 Transform Transform 以下的代码包含: 标准化的示例残差化的示例 # huggingface # transformers# https://www.bilibili.com/video/BV1At4y1W75x?spm_id_from333.999.0.0import copy import math from collections import namedtupleimport …

C++派生类对基类成员的访问

派生类继承了基类的全部数据成员和除了构造、析构函数之外的全部成员函数,但是这些成员在派生类中的访问属性在派生类的过程中是可以调整的,继承方式控制了基类中具有的不同访问属性。 基类的成员有公有(public)、保护&am…

项目实用linux 操作详解-轻松玩转linux

我之前写过完整的linux系统详解介绍: LInux操作详解一:vmware安装linux系统以及网络配置 LInux操作详解二:linux的目录结构 LInux操作详解三:linux实际操作及远程登录 LInux操作详解四:linux的vi和vim编辑器 LInux操作…

VPN以及GRE和MGRE

VPN VPN — 是虚拟专用网络 通俗地说,就是通过虚拟的手段,将两个独立的网络,穿越一个公共网络进行连接,实现点到点专线的效果(可以理解为:一个分公司通过公网和总公司建立点到点的专线连接) 现…

数据库理论基础

1.什么是数据库 1.1数据 描述事物的符号记录, 可以是数字、 文字、图形、图像、声音、语言等,数据有多种形式,它们都可以经过数字化后存入计算机。 1.2数据库 存储数据的仓库,是长期存放在计算机内、有组织、可共享的大量数据…