【python】变量的保存与加载——txt、json、joblib & pickle

一、前言

1.1 需求分析

  python 代码在执行完毕后,会回收全部的变量。要重新获得其中的中间变量,重复运行代码即可解决该问题。
  但是,如果目标是对中间变量进行分析处理,这样会使得代码冗杂。一些场景下,执行代码还会花费大量的时间。随机数的引入还可能使得每次复现的结果不同。
  因而,本文就如何保存代码执行过程中的中间变量,对 txt、json、joblib 以及 pickle方法进行了探究。

1.2 准备工作

  为了验证这些方法的效果,本文先通过 random 方法获取一些随机变量 x 和 y 。由于 json 、joblib 和 pickle 文件中只能存储一个变量,本文还创建了 Variables 字典变量,用于间接存储变量 x 和 y 。

import random

x = [random.random() for _ in range(5)]
y = [random.randint(1,10) for _ in range(5)]
Variables = {"x": x, "y": y}
print("原先的全部变量:", Variables)

  此外,joblib 库属于第三方库,并非 python 自带,在使用前需要安装:

>pip install joblib

二、方法合集

2.1 txt 方法

  提到保存,首先最容易被想到的就是 txt 文件。该方法能够简洁快速地保存字符串。

2.1.1 保存变量

  首先,将变量保存到 txt 文件。该方法需要将 x 和 y 转化为字符串。由于该方式读取往往通过行数来区分不同的变量,故而,需要在 x 和 y 字符串中间插入换行符“\n”。

# 将变量保存到 txt 文件中
with open("variables.txt", 'w', encoding="utf-8") as f:
    f.write(str(x))
    f.write("\n")
    f.write(str(y))

2.1.2 加载 txt 文件

  其次,按行读取变量。通过 readline 可以获得每一行的字符串,再通过 eval 函数,即可将字符串转化回变量。

# 从 txt 文件中加载变量
with open("variables.txt", 'r', encoding="utf-8") as f:
    x_str = f.readline()
    y_str = f.readline()
    x_loaded = eval(x_str)
    y_loaded = eval(y_str)

2.1.3 验证变量

  最后,验证变量。通过 == 符号,验证保存的变量是否与原先的变量一致。

# 验证
print("x 加载前后一致:", x_loaded == x)
print("y 加载前后一致:", y_loaded == y)

# x 加载前后一致: True
# y 加载前后一致: True

2.1.4 txt 文件样式

  txt 文件内容如下:
txt
  虽然本方法较为简单,但需要明确行与变量的对应关系。此外,对于复杂的对象,如自定义的类、训练的深度学习模型等,该方法的保存较为困难。

2.2 json 方法

2.2.1 保存变量

  json 也是文件保存常用的方法,跟 txt 一样可以跨平台实现数据交互。json 的兼容性和效率要更高。
  首先,保存变量到 json 文件。该文件以“json”为后缀,可以指定编码格式。此处,dump 传入的 f 为文件对象。

# 将变量保存到 json 文件中
with open("variables.json", "w", encoding="utf-8") as f:
    json.dump(Variables, f)

2.2.2 加载 json 文件

  其次,从 json 文件中加载变量。load 传入的为文件对象。
  

# 从 json 文件中加载变量
with open("variables.json", "r", encoding="utf-8") as f:
    Variables_loaded = json.load(f)
print("加载出的全部变量:", Variables)

2.2.3 提取变量

  最后,获取对应变量并验证。

# 验证
x_loaded = Variables_loaded['x']
y_loaded = Variables_loaded['y']
print("x 加载前后一致:", x_loaded == x)
print("y 加载前后一致:", y_loaded == y)
print("全部变量加载前后一致:", Variables_loaded == Variables)

2.2.4 json 文件样式

  该方法文件中仅保存一个变量,共占一行。类似 txt,该方法在面对复杂对象时,序列化能力较差。
json
  将该行内容复制,到 json 解析等网站上可以快速解析。
json解析

2.3 joblib 方法

  joblib 用于高效地序列化和反序列化 Python 对象。其以特定的二进制格式保存变量,使用方法较为简单,在科学计算、机器学习和数据处理等领域中被广泛使用。

2.3.1 保存变量

  首先,保存变量到 joblib 文件。使用 dump 方法,直接将变量保存到对应名称的文件中。文件以“joblib”为后缀。注意:这里使用的是文件名,而非文件对象。

# 将变量保存到 joblib 文件中
joblib.dump(Variables, 'variables.joblib')

2.3.2 加载 joblib 文件

  其次,加载 joblib 文件。此处也是直接使用文件名。

# 从 joblib 文件中加载变量
Variables_loaded = joblib.load('variables.joblib')
print("加载出的全部变量:", Variables)

2.3.3 提取变量

  最后,从字典中获取多个变量并验证。

# 验证
x_loaded = Variables_loaded['x']
y_loaded = Variables_loaded['y']
print("x 加载前后一致:", x_loaded == x)
print("y 加载前后一致:", y_loaded == y)
print("全部变量加载前后一致:", Variables_loaded == Variables)

2.3.4 joblib 文件样式

  joblib 方法保存的文件为二进制格式,不能直接阅读。
joblib

2.4 pickle 方法

  pickle 是 python 自带的一种序列化库。该方法支持对所有 python 对象的序列化存储,使用二进制进行保存和读取。

2.4.1 保存变量

  首先,保存到 pkl 文件。写入时采用“wb”方法,以二进制的形式写入。pickle 文件的后缀为“pkl”。在 dump 中传入的 f 为文件对象,而非文件名,因此常配合 with-open-as 语句一起使用。

# 将变量保存到 pkl 文件中
with open("variables.pkl", "wb") as f:
    pickle.dump(Variables, f)

2.4.2 加载 pkl 文件

  其次,从 pkl 文件中加载变量。采用“rb”二进制方法读取。load 参数为文件对象,返回结果为对应的变量。

# 从 pkl 文件中加载变量
with open("variables.pkl", "rb") as f:
    Variables_loaded = pickle.load(f)
print("加载出的全部变量:", Variables)

2.4.3 提取变量

  最后,抽取变量并验证。

# 验证
x_loaded = Variables_loaded['x']
y_loaded = Variables_loaded['y']
print("x 加载前后一致:", x_loaded == x)
print("y 加载前后一致:", y_loaded == y)
print("全部变量加载前后一致:", Variables_loaded == Variables)

2.4.4 pkl 文件样式

  类似于 joblib,由于使用二进制进行存储,一般 pkl 文件内容不能直接观察到:
pickle

三、运行截图

运行截图

四、完整代码

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# @FileName  : variables_save_load.py
# @Time      : 2024/4/21 0:14
# @Author    : Carl.Zhang
# Function   : save

import json
import pickle
import joblib
import random

x = [random.random() for _ in range(5)]
y = [random.randint(1,10) for _ in range(5)]
Variables = {"x": x, "y": y}
print("原先的全部变量:", Variables)


def method_txt():
    # txt
    print("\ntxt method:")
    # 将变量保存到 txt 文件中
    with open("variables.txt", 'w', encoding="utf-8") as f:
        f.write(str(x))
        f.write("\n")
        f.write(str(y))

    # 从 txt 文件中加载变量
    with open("variables.txt", 'r', encoding="utf-8") as f:
        x_str = f.readline()
        y_str = f.readline()
        x_loaded = eval(x_str)
        y_loaded = eval(y_str)

    # 验证
    print("x 加载前后一致:", x_loaded == x)
    print("y 加载前后一致:", y_loaded == y)

def method_json():
    # json
    print("\njson method:")
    # 将变量保存到 json 文件中
    with open("variables.json", "w", encoding="utf-8") as f:
        json.dump(Variables, f)

    # 从 json 文件中加载变量
    with open("variables.json", "r", encoding="utf-8") as f:
        Variables_loaded = json.load(f)
    print("加载出的全部变量:", Variables)

    # 验证
    x_loaded = Variables_loaded['x']
    y_loaded = Variables_loaded['y']
    print("x 加载前后一致:", x_loaded == x)
    print("y 加载前后一致:", y_loaded == y)
    print("全部变量加载前后一致:", Variables_loaded == Variables)


def method_joblib():
    # joblib
    print("\njoblib method:")
    # 将变量保存到 joblib 文件中
    joblib.dump(Variables, 'variables.joblib')

    # 从 joblib 文件中加载变量
    Variables_loaded = joblib.load('variables.joblib')
    print("加载出的全部变量:", Variables)

    # 验证
    x_loaded = Variables_loaded['x']
    y_loaded = Variables_loaded['y']
    print("x 加载前后一致:", x_loaded == x)
    print("y 加载前后一致:", y_loaded == y)
    print("全部变量加载前后一致:", Variables_loaded == Variables)


def method_pickle():
    # pickle
    print("\npickle method:")
    # 将变量保存到 pkl 文件中
    with open("variables.pkl", "wb") as f:
        pickle.dump(Variables, f)

    # 从 pkl 文件中加载变量
    with open("variables.pkl", "rb") as f:
        Variables_loaded = pickle.load(f)
    print("加载出的全部变量:", Variables)

    # 验证
    x_loaded = Variables_loaded['x']
    y_loaded = Variables_loaded['y']
    print("x 加载前后一致:", x_loaded == x)
    print("y 加载前后一致:", y_loaded == y)
    print("全部变量加载前后一致:", Variables_loaded == Variables)



if __name__ == '__main__':
    method_txt()
    method_json()
    method_joblib()
    method_pickle()

更多 python 的使用方法和应用,敬请关注后续更新~

  • 16
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: 这个错误通常是因为你的 Python 环境没有安装 `jsonpickle` 模块导致的。`jsonpickle` 是一个 Python 序列化/反序列化库,它可以将 Python 对象序列化为 JSON 格式并保存到文件中,也可以将 JSON 格式的数据反序列化为 Python 对象。 你可以通过在命令行中运行以下命令来安装 `jsonpickle` 模块: ``` pip install jsonpickle ``` 如果你使用的是 Python 3,则你可以使用以下命令安装: ``` pip3 install jsonpickle ``` 运行上述命令后,等待安装完成,然后再次尝试运行你的代码。 ### 回答2: ModuleNotFoundError: 找不到名为 'jsonpickle' 的模块。 这个错误通常是由于系统中没有安装所需的模块 'jsonpickle' 导致的。要解决这个问题,你可以按照以下步骤操作: 1. 确认 'jsonpickle' 是否正确安装。可以在终端或命令提示符中运行以下命令来检查是否已安装该模块: ```shell pip list | grep jsonpickle ``` 如果没有找到 'jsonpickle',则需要安装这个模块。 2. 使用 pip 安装 'jsonpickle'。可以在终端或命令提示符中运行以下命令来安装 'jsonpickle': ```shell pip install jsonpickle ``` 这将从官方 Python 包索引中下载并安装 'jsonpickle'。 3. 检查 Python 环境变量。有时,Python 解释器可能无法找到新安装的模块。请确保 Python 解释器能够正确地找到 'jsonpickle' 模块所在的位置。 4. 如果你在使用虚拟环境,请确保你的虚拟环境中已正确安装 'jsonpickle'。可以激活虚拟环境,然后按照步骤2中的命令来安装 'jsonpickle'。 如果按照上述步骤操作后仍然出现错误,可能是由于其他问题引起的,可以尝试在相关论坛或社区寻求帮助,以便其他开发者能够提供更具体的解决方案。 ### 回答3: 这个错误是由于没有找到名为 'jsonpickle' 的模块导致的。 'jsonpickle' 是一个Python模块,提供了将Python对象序列化为JSON格式的功能。 解决这个问题的方法是安装 'jsonpickle' 模块。可以使用命令行工具pip来安装。打开终端或命令提示符窗口,并输入以下命令: ```shell pip install jsonpickle ``` 此命令将从Python软件包索引中下载 'jsonpickle' 并自动安装到您的Python环境中。 如果您已经安装了 'jsonpickle' ,但仍然出现了这个错误,可能是因为您的Python环境无法找到该模块。这可能是因为 'jsonpickle' 模块未正确安装或没有放在正确的位置。 为了解决这个问题,您可以尝试重新安装 'jsonpickle' 模块,或者检查您的Python环境变量,确保已经正确配置了Python解释器和模块搜索路径。 如果您使用的是虚拟环境,请确保在激活了该虚拟环境后安装和使用 'jsonpickle' 模块。 希望这些信息对您有帮助,如果问题仍然存在,请提供更多详细信息,以便我们更好地帮助您解决问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

今夕晚风依旧

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值