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

python如何通过json以及pickle读写保存数据

记录信息

比如说我写了这样一段程序,记录了爱吃的食物:

food_list = []while True:c = input("输入1添加新的食物,输入2查询已添加的食物,输入exit退出:")if c == "1":new_food = input("输入你喜欢的食物:")food_list.append(new_food)print("添加成功!")elif c == "2":for i in food_list:print(i, end=" ")print()elif c == "exit":print("谢谢,下次再见!")break

但是,很快就会发现这样一个问题,当我们下次再运行程序的时候,上次输入的内容全都没了,怎么会这样呢?

原理其实很简单,在程序运行的时候,我们存储的信息放入了python的列表之中,这些信息是保存在内存之中的,当程序运行结束,这些信息就没了。

那么,如果我希望将输入保存起来,下次还能看到,该怎么办呢?这个时候,就需要将要保存的内容存储到文件了。

json存储数据

json介绍

json,全名:JavaScript Object Notation,是一种轻量级的数据交换格式,最初基于JavaScript,但是后来随着发展,现在几乎被所有编程语言支持。

json数据非常适合人类阅读和编写,也可以在网络应用中进行数据传输,当然也可以作为数据存储。最常见的json数据类型包括object(对象),以及array(数组)。

json对象:

{"name": "仙草","age": 18,"isStudent": false
}

json数组:

["啃达鸡美食", "疯狂星期四", "可口可乐"]

对于python中的数据类型来说,列表会被保存为json数组,而字典会被保存为json对象。

json写入文件

import json# 需要保存的数据
data = [1, 2, 3, 4, 5]# 转为json数据
json_data = json.dumps(data)# 写入文件
with open("record.json", "w") as f:f.write(json_data)

json文件读取

import jsonwith open("record.json", "r") as f:json_data = f.read()data = json.loads(json_data)

为程序添加保存读取

import jsontry:with open("food_list.json", "r") as file:food_list = json.load(file)
except FileNotFoundError:food_list = []while True:c = input("输入1添加新的食物,输入2查询已添加的食物,输入exit退出:")if c == "1":new_food = input("输入你喜欢的食物:")food_list.append(new_food)print("添加成功!")with open("food_list.json", "w") as file:file.write(json.dumps(food_list))elif c == "2":for i in food_list:print(i, end=" ")print()elif c == "exit":print("谢谢,下次再见!")break

pickle序列化

pickle介绍

pickle可以对一个python对象进行二进制序列化以及反序列化,比起json,使用pickle的一个好处是,pickle可以保存任意一个python对象,例如类或者函数,但是json则不能直接这样做。

注意:pickle具有危险性,因此,不要加载你不信任的内容,必须使用可信任的数据。

pickle写入文件

import pickledata = [1, 2, 3, 4, 5]with open("data.pkl", "wb") as f:pickle.dump(data, f)

pickle文件读取

import picklewith open("data.pkl", "rb") as f:loaded_data = pickle.load(f)print(loaded_data)

pickle具有安全风险

在python的官方文档上,有这样一段重要提示:“如果解序化的数据是由手段高明的攻击者精心设计的,这种不受信任来源的pickle数据可以执行任意代码。”

很多人对此有一些困惑,真的有这么严重吗?答案是肯定的。假设,有这样一段恶意代码:

import pickle
import osclass Example:def __reduce__(self):return (os.system, ('echo "不能随便使用危险的代码!"',))malicious_data = pickle.dumps(Example())with open("malicious.pkl", "wb") as file:file.write(malicious_data)

此时, 当代码重新被加载的时候,就会执行恶意代码,调用系统命令。

import picklewith open("malicious.pkl", "rb") as file:data = pickle.load(file)

安全使用pickle

一种安全使用自己生成的pickle的方法,是使用hmac对序列化的数据进行签名,下次使用的时候进行签名的认证,以保证当初生成的pickle没有被他人篡改。下面是一种可能的实现:

import pickle
import hmac
import hashlibsecret_key = b"your-secret-key"def save_signed_pickle(data, file_path, key):# 使用pickle序列化数据serialized_data = pickle.dumps(data)# 生成签名signature = hmac.new(key, serialized_data, hashlib.sha256).digest()# 将签名和序列化数据一起保存到文件with open(file_path, "wb") as f:f.write(signature)f.write(serialized_data)def load_signed_pickle(file_path, key):# 从文件加载数据并验证签名with open(file_path, "rb") as f:signature = f.read(32)  # 签名长度为32字节,因此恰好可以读取到签名serialized_data = f.read()# 重新计算签名并进行验证expected_signature = hmac.new(key, serialized_data, hashlib.sha256).digest()if hmac.compare_digest(signature, expected_signature):# 签名匹配,说明数据未被篡改,可以安全反序列化return pickle.loads(serialized_data)else:# 签名不匹配,数据可能已被篡改raise ValueError("Data integrity check failed!")

相关文章:

python如何通过json以及pickle读写保存数据

记录信息 比如说我写了这样一段程序,记录了爱吃的食物: food_list []while True:c input("输入1添加新的食物,输入2查询已添加的食物,输入exit退出:")if c "1":new_food input("输入你…...

【SPIE出版,EI检索稳定】2024年人机交互与虚拟现实国际会议(HCIVR 2024,11月15-17日)

2024年人机交互与虚拟现实国际会议(HCIVR 2024) 2024 International Conference on Human-Computer Interaction and Virtual Reality 官方信息 会议官网:www.hcivr.org 2024 International Conference on Human-Computer Interaction and …...

Linux vim编辑器

前言: 首先我们来了解一下什么是编辑器,通常我们在widow系统下例如C/C我们进行写代码时,我们通过vs2022等等编译器进行,这里的编译器是一种IDE(集成开发环境),集成开发环境是将代码编辑器、编译…...

普推知产:申请商标名称从4字改成3字下了初审!

近日7月的时候普推知产老杨帮客户申请的水果猕猴桃31类商标,初步审定公告下来了,基本没什么问题三个月公告结束后一个月内就可以拿到商标注册证,客户所在地全国有名猕猴桃之县,同质化竞争还得需要商标才可以。 刚开始了解到这位做…...

Flink 状态精准一次性特性

Flink 的一个重大价值在于, 它既保证了 exactly-once ,也具有低延迟和高吞吐 的处理能力 。 1.端到端(End-To-End)状态一致性 端到端的一致性保证,意味着结果的正确性贯穿了整个流处理应用的始终;每 一…...

算法笔记day08

1.游游的水果大礼包 这道题很容易让人想到贪心,但是其实是一道枚举题,只需举一个反例,贪心无非就是哪个礼包价值大,就优先组成哪个礼包。 算法思路: 设可以组成x个a礼包,y个b礼包,求ax by的最…...

在Selenium中有哪些元素对象操作方法?( ̄﹃ ̄)

在Selenium中,driver.find_element() 方法用于定位页面上的单个元素。一旦你定位到了一个元素,你可以对这个元素执行多种操作。此外,driver.find_element() 只是定位元素的方法之一,它还有其他一些相关的方法和属性,但…...

sqli-labs靶场安装以及刷题记录-docker

sqli-labs靶场安装以及刷题记录-docker sqli-labs靶场安装-dockersqli-labs靶场刷题less-1 单引号less-2 数字型less-3 单引号括号less-4 双引号括号less-5 单引号布尔盲注less-6 双引号布尔盲注less-7 单引号加括号、输出到文件less-8 单引号布尔盲注less-9 单引号时间盲注les…...

谷歌仓库管理工具repo

Google 的仓库管理工具 Repo 是一个用于管理包含多个 Git 仓库的大型项目的命令行工具。它最初由 Google 为 Android 操作系统开发,以简化和协调众多子项目的版本控制和协作过程。以下是对 Repo 的详细解释: 主要功能与特点 多仓库管理: Rep…...

C#的自定义Tip窗体 - 开源研究系列文章

上次编写了自定义的提示和对话框窗体,这次记录的是自定义的Tip窗体,用于显示提示操作。有时间没编程了,这次就当进行了记录。 1、 项目目录; 2、 源码介绍; 1) 实现; 2) 应用; 3、 运行界面&…...

目前最新 Reflector V11.1.0.2067版本 .NET 反编译软件

目前最新 Reflector V11.1.0.2067版本 .NET 反编译软件 一、简介二、.NET Reflector的主要功能包括:1. **反编译**: 反编译是将已编译的.NET程序集(如.dll或.exe文件)转换回可读的源代码。这使得开发者可以查看和学习第三方库的实现细节&…...

软考:CORBA架构

CORBA过时了吗 CORBA指南 个人小结: IPC,进程间通信,Socket应用在不同机器之间的通信 RPC是一种技术思想而非一种规范 但站在八九十年代的当口,简单来说,就是我在本地调用了一个函数,或者对象的方法&…...

qt QSaveFile详解

QSaveFile 是 Qt 提供的一个类,用于安全地保存文件。它的主要特点是在写入文件时确保数据完整性,以防止文件损坏。使用 QSaveFile,您可以创建一个临时文件,并在成功写入后将其重命名为目标文件,这样可以避免在写入过程…...

【Linux】线程池详解及其基本架构与单例模式实现

目录 1.关于线程池的基本理论 1.1.线程池是什么? 1.2.线程池的应用场景: 2.线程池的基本架构 2.1.线程容器 2.2.任务队列 2.3.线程函数(HandlerTask) 2.4.线程唤醒机制 3.添加单例模式 3.1.单例模式是什么&…...

运输层知识点汇总3

目录 前言 二、为什么在TCP首部中有一个首部长度字段,而UDP的首部就没有这个字段? 三、一个TCP报文段的数据部分最多为多少字节?为什么?如果用户要传送的数据的字节长度超过TCP报文段中的序号字段可能编出的最大序号&#xff0…...

浔川社团官方联合会提前入驻

近期,我们浔川社团官方发现文章再次被不明网站转发。这一情况引起了我们的高度警觉和深刻反思。我们一直致力于为大家提供高质量、有价值的内容,用心创作每一篇文章,以展现我们社团的风采和理念。然而,这些不明网站未经授权的转发…...

比例数据可视化(Python实现板块层级图绘制)——Instacart Market Basket Analysis

【实验名称】 实验一:绘制板块层级图 【实验目的】 1. 掌握数据文件读取 2. 掌握数据处理的方法 3. 实现板块层级图的绘制 【数据介绍】Instacart Market Basket Analysis 1. 数据说明 数据共有300 0000orders, 20 0000users, …...

C++研发笔记8——C语言程序设计初阶学习笔记6

在第一部分——课前准备的学习中,我就提到了学习C语言的过程中,练习是必不可少的环节,所以本篇笔记我们来进行记录我们学习《C语言程序设计初阶》阶段的第一篇练习文章。 题目一 下面哪个不是C语言内置的数据类型: A.char B.d…...

0softmax和背后的最大熵(极大似然法)

只要无穷阶矩都一样,那么两个分布一定一样。 整理思路:1、设定样本的概率模型与目标概率模型一致(两个模型特性函数一致)建立服从伯努利分布的变量(此处需要理解样本空间及变量的关系)对两个模型进行降维&a…...

6,000 个网站上的假 WordPress 插件提示用户安装恶意软件

黑客使用窃取的凭证感染 WordPress 网站,并向其发送虚假插件,通过虚假的浏览器更新提示向最终用户发送恶意软件和信息窃取程序。 该恶意活动基于ClickFix假浏览器更新恶意软件的新变种,自 2024 年 6 月以来已使用假 WordPress 插件感染了超过…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南

点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...

设计模式和设计原则回顾

设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

【Linux】shell脚本忽略错误继续执行

在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...

深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法

深入浅出:JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中,随机数的生成看似简单,却隐藏着许多玄机。无论是生成密码、加密密钥,还是创建安全令牌,随机数的质量直接关系到系统的安全性。Jav…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路

进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...

系统设计 --- MongoDB亿级数据查询优化策略

系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...

django filter 统计数量 按属性去重

在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...

ElasticSearch搜索引擎之倒排索引及其底层算法

文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...

OPENCV形态学基础之二腐蚀

一.腐蚀的原理 (图1) 数学表达式:dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一,腐蚀跟膨胀属于反向操作,膨胀是把图像图像变大,而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...

深度学习习题2

1.如果增加神经网络的宽度,精确度会增加到一个特定阈值后,便开始降低。造成这一现象的可能原因是什么? A、即使增加卷积核的数量,只有少部分的核会被用作预测 B、当卷积核数量增加时,神经网络的预测能力会降低 C、当卷…...