【Python学习笔记】序列化

news2024/9/21 16:44:52

【Python学习笔记】序列化

文章目录

  • 【Python学习笔记】序列化
  • 1.python使用pickle序列化数据
    • 1.1. 环境准备
    • 1.2. 序列化datetime对象
    • 1.3. 序列化DataFrame对象
      • 1.3.1 json
      • 1.3.2 pickle
    • 1.4 序列化list列表
  • 2. flaskweb接口传输序列化数据
    • 2.1. bytes形式传输
      • 2.1.1. datetime对象
      • 2.1.2. DataFrame对象
      • 2.1.3. list列表
    • 2.2. json形式传输
      • 2.2.1. datetime对象
      • 2.2.2. DataFrame对象
      • 2.2.3. list列表
  • 3. base64
  • 4. pickle和json
  • 5. 序列化的数据大小变化
  • 6. 总结

1.python使用pickle序列化数据

1.1. 环境准备

import pickle

1.2. 序列化datetime对象

import datetime
import pickle

now = datetime.datetime.now()
# 序列化
p_now = pickle.dumps(now)
# 反序列化
re_p_now = pickle.loads(p_now)
print(re_p_now)

1.3. 序列化DataFrame对象

1.3.1 json

import json
import pandas as pd


d1 = {
    'x': [1, 2, 3],
    'y': [1, 2, 3],
    'z': [1, 2, 3]
}

df = pd.DataFrame(d1)
dict_df = df.to_dict()
json_df = json.dumps(dict_df)
print(json_df)
print(type(json_df))

1.3.2 pickle

import pandas as pd
import pickle


d1 = {
    'x': [1, 2, 3],
    'y': [1, 2, 3],
    'z': [1, 2, 3]
}

df = pd.DataFrame(d1)
p_df = pickle.dumps(df)
new_p_df = pickle.loads(p_df)

print(new_p_df)

1.4 序列化list列表

import pandas as pd
import pickle


d1 = {
    'x': [1, 2, 3],
    'y': [1, 2, 3],
    'z': [1, 2, 3]
}

d2 = {
    'x': [4, 5, 6],
    'y': [4, 5, 6],
    'z': [4, 5, 6]
}

df1 = pd.DataFrame(d1)
df2 = pd.DataFrame(d2)

df_list = [df1, df2]

p_df_list = pickle.dumps(df_list)
new_p_df_list = pickle.loads(p_df_list)

print(type(new_p_df_list))
for e in new_p_df_list:
    print(e)

2. flaskweb接口传输序列化数据

2.1. bytes形式传输

2.1.1. datetime对象

import datetime
import pickle
import requests

now = datetime.datetime.now()
# 序列化
p_now = pickle.dumps(now)

url = 'http://127.0.0.1:8023/test'
headers = {'Content-Type': 'application/json'}

r = requests.post(url, data=p_now, headers=headers)
print(r.text)
print(r.status_code)
import base64
import pickle
from flask import Flask, request, jsonify

app = Flask(__name__)


@app.route('/test', methods=['POST'])
def test():
    # 从data中接收bytes数据
    data = request.data
    print(data)
    now = pickle.loads(data)
    print(now)
    return jsonify({"status": "success"}), 200


if __name__ == '__main__':
    app.run(host='127.0.0.1', port=8023, debug=True)

2.1.2. DataFrame对象

import pandas as pd
import pickle
import requests

d1 = {
    'x': [1, 2, 3],
    'y': [1, 2, 3],
    'z': [1, 2, 3]
}

df = pd.DataFrame(d1)
p_df = pickle.dumps(df)

headers = {'Content-Type': 'application/json'}
url = 'http://127.0.0.1:8023/test'
r = requests.post(url, data=p_df, headers=headers)

print(r.text)
print(r.status_code)
import pickle
from flask import Flask, request, jsonify

app = Flask(__name__)


@app.route('/test', methods=['POST'])
def test():
    # data = request.json['data']
    # decode = base64.b64decode(data)
    # decode_now = pickle.loads(decode)
    # print(decode_now)
    data = request.data
    print(data)
    df = pickle.loads(data)
    print(df)
    return jsonify({"status": "success"}), 200


if __name__ == '__main__':
    app.run(host='127.0.0.1', port=8023, debug=True)

2.1.3. list列表

import datetime
import pandas as pd
import pickle
import requests

d1 = {
    'x': [1, 2, 3],
    'y': [1, 2, 3],
    'z': [1, 2, 3]
}

d2 = {
    'x': [4, 5, 6],
    'y': [4, 5, 6],
    'z': [4, 5, 6]
}

now = datetime.datetime.now()

df1 = pd.DataFrame(d1)
df2 = pd.DataFrame(d2)

df_list = [now, df1, df2]

p_df_list = pickle.dumps(df_list)

headers = {'Content-Type': 'application/json'}
url = "http://127.0.0.1:8023/test"
r = requests.post(url, data=p_df_list, headers=headers)
print(r.status_code)
print(r.text)
import pickle
from flask import Flask, request, jsonify

app = Flask(__name__)


@app.route('/test', methods=['POST'])
def test():
    # data = request.json['data']
    # decode = base64.b64decode(data)
    # decode_now = pickle.loads(decode)
    # print(decode_now)
    data = request.data
    print(data)
    data_list = pickle.loads(data)
    for e in data_list:
        print(e)
    return jsonify({"status": "success"}), 200


if __name__ == '__main__':
    app.run(host='127.0.0.1', port=8023, debug=True)

2.2. json形式传输

2.2.1. datetime对象

import base64
import datetime
import pickle

import requests

now = datetime.datetime.now()
p_now = pickle.dumps(now)  # bytes
encode_now = base64.b64encode(p_now).decode('utf-8')  # str

# json不直接支持字节数组 (bytes) 类型。
data = {
    'data': encode_now
}

headers = {'Content-Type': 'application/json'}
url = 'http://127.0.0.1:8023/test'
r = requests.post(url, json=data, headers=headers)

print(r.status_code)
print(r.text)
import base64
import pickle

from flask import Flask, request, jsonify

app = Flask(__name__)


@app.route('/test', methods=['POST'])
def test():
    # 从json中接收数据
    data = request.json['data']
    print(data)
    decode = base64.b64decode(data)
    print(decode)
    decode_now = pickle.loads(decode)
    print(decode_now)
    return jsonify({"status": "success"}), 200


if __name__ == '__main__':
    app.run(host='127.0.0.1', port=8023, debug=True)

2.2.2. DataFrame对象

import base64

import pandas as pd
import pickle

import requests

d1 = {
    'x': [1, 2, 3],
    'y': [1, 2, 3],
    'z': [1, 2, 3]
}

df = pd.DataFrame(d1)
p_df = pickle.dumps(df)
encode_df = base64.b64encode(p_df).decode('utf-8')
data = {
    'data': encode_df
}

headers = {'Content-Type': 'application/json'}
url = 'http://127.0.0.1:8023/test'
r = requests.post(url, json=data, headers=headers)

print(r.text)
print(r.status_code)
import base64
import pickle

from flask import Flask, request, jsonify

app = Flask(__name__)


@app.route('/test', methods=['POST'])
def test():
    data = request.json['data']
    print(data)
    decode = base64.b64decode(data)
    print(decode)
    decode_now = pickle.loads(decode)
    print(decode_now)
    return jsonify({"status": "success"}), 200

2.2.3. list列表

import base64
import datetime
import pandas as pd
import pickle

import requests

d1 = {
    'x': [1, 2, 3],
    'y': [1, 2, 3],
    'z': [1, 2, 3]
}

d2 = {
    'x': [4, 5, 6],
    'y': [4, 5, 6],
    'z': [4, 5, 6]
}

now = datetime.datetime.now()

df1 = pd.DataFrame(d1)
df2 = pd.DataFrame(d2)

df_list = [now, df1, df2]

p_df_list = pickle.dumps(df_list)
encode_list = base64.b64encode(p_df_list).decode('utf-8')

headers = {'Content-Type': 'application/json'}
url = "http://127.0.0.1:8023/test"
data = {
    'data': encode_list
}
r = requests.post(url, json=data, headers=headers)
print(r.status_code)
print(r.text)
import base64
import pickle
from flask import Flask, request, jsonify

app = Flask(__name__)


@app.route('/test', methods=['POST'])
def test():
    data = request.json['data']
    print(data)
    decode = base64.b64decode(data)
    print(decode)
    decode_now = pickle.loads(decode)
    for e in decode_now:
        print(e)
    return jsonify({"status": "success"}), 200


if __name__ == '__main__':
    app.run(host='127.0.0.1', port=8023, debug=True)

3. base64

Base64 是一种将二进制数据编码为文本字符串的方式。它通常用于在需要通过文本协议(如电子邮件和HTTP)传输二进制数据时使用。Base64 可以编码任何形式的二进制数据,包括但不限于以下类型:

  1. 文件数据:任意类型的文件(例如,图像、音频、视频、文档等)都可以编码为Base64字符串。
  2. 对象数据:通过序列化(如使用 picklejson 序列化)将对象转换为字节数组,然后对这些字节数组进行Base64编码。
  3. 文本数据:虽然文本数据本身是字符串形式,但也可以进行Base64编码以确保其兼容性或加密性。

4. pickle和json

picklejson 是 Python 中常用的两种序列化和反序列化数据的方式。它们各有优缺点,适用于不同的场景。以下是它们的主要区别:

  1. 序列化和反序列化的对象类型
    1. pickle:
      • 可以序列化和反序列化几乎所有的 Python 对象,包括复杂的对象,如类实例、自定义对象等。
      • 序列化后的数据是二进制格式,因此适合于处理任意的 Python 数据结构。
    2. json:
      • 只能序列化和反序列化基本数据类型,如字典、列表、字符串、数字、布尔值和 None
      • 序列化后的数据是文本格式,因此适合于与其他编程语言和系统进行数据交换。
      • JSON 数据格式是标准化的,广泛用于 Web 开发和API通信。
  2. 数据格式
    1. pickle:
      • 二进制格式,不适合阅读。
      • 适合于在 Python 内部使用或在 Python 应用程序之间传输数据。
    2. json:
      • 文本格式,易于阅读和调试。
      • 适合于 Web 开发、配置文件和跨语言的数据交换。
  3. 安全性
    1. pickle:
      • 存在安全隐患,可能会执行任意代码。因此,不要反序列化不受信任的数据。
      • 只适合在受信任的环境中使用。
    2. json:
      • 更加安全,因为它仅限于基本数据类型,不会执行任意代码。
      • 适合在不受信任的环境中使用。
  4. 性能
    1. pickle:
      • 对于复杂数据结构,pickle 通常比 json 更快,因为它直接处理二进制数据。
      • 适用于需要高效序列化和反序列化的大量数据的场景。
    2. json:
      • 由于其文本格式,性能可能会稍慢,但由于其广泛兼容性和易用性,通常性能是可以接受的。
      • 适用于需要与外部系统或前端进行数据交换的场景。
  5. 跨语言兼容性
    1. pickle:
      • 专为 Python 设计,不适合与其他编程语言交互。
      • 适合于在 Python 程序之间传输数据。
    2. json:
      • 是一种标准的文本格式,支持几乎所有编程语言。
      • 适合于跨语言的数据交换。

5. 序列化的数据大小变化

import pandas as pd
import pickle


df = pd.read_csv('2041208842560.csv')
p_df = pickle.dumps(df)

with open('test05', 'wb') as f:
    f.write(p_df)

文件大小从20.8MB—>16.5MB

6. 总结

  1. 使用 pickle 当你需要序列化复杂的 Python 对象,且数据只在受信任的 Python 环境中传输。
  2. 使用 json 当你需要与其他系统(如前端、数据库、非Python语言)进行数据交换,或者需要人类可读的数据格式。

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

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

相关文章

k8s使用kustomize来部署应用

k8s使用kustomize来部署应用 本文主要是讲述kustomzie的基本用法。首先,我们说一下部署文件的目录结构。 ./ ├── base │ ├── deployment.yaml │ ├── kustomization.yaml │ └── service.yaml └── overlays└── dev├── kustomization.…

SpringBoot 集成 Sharding-JDBC 实现读写分离、分库分表

文章目录 一、Sharding-JDBC的应用场景二、SpringBoot 集成 Sharding-JDBC2.1、前期准备2.2、导入pom.xml依赖包2.3、结构代码实现2.3.1、MybatisPlusConfig(分页插件)2.3.2、TOrder(订单对象)2.3.3、TOrderMapper(订单…

【论文阅读】Fourier Spectrum Discrepancies in Deep Network Generated Images

文章目录 Learning Self-Consistency for Deepfake Detection背景关键方法傅立叶谱分析图像转换分类实验讨论总结Learning Self-Consistency for Deepfake Detection 会议:NeurIPS 2020 作者: 背景 深度生成模型(GAN、VAE等)能生成与真图无法区分的逼真图像 关键 对…

批发行业进销存-库存预警 源码CyberWinApp-SAAS 本地化及未来之窗行业应用跨平台架构

一交互代码 未来之窗_人工智能_VOS通用(数据,库存预警,1080,500);"> 二、通用代码 function 未来之窗_人工智能_VOS通用(网址,标题,宽度,高度){var 机器人默认page网址;var 未来之窗app_通用ID"未来之窗防重复";var title标题;var 机器人宽度宽度;var 机器…

Tensorflow预训练模型转PyTorch

深度学习领域是计算机科学中变化最快的领域之一。大约 5 年前,当我开始研究这个主题时,TensorFlow 被认为是主导框架。如今,大多数研究人员已经转向 PyTorch。 NSDT工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/…

Opencv学习-窗口交互

交互操作能够增加用户对程序流程的控制,使程序可以根据用户需求实现不同的处理结果。有时某一个参数需要反复尝试不同的数值,这时交互操作可以实现在程序运行过程中改变参数数值的作用,避免重复运行程序,节省时间,同时…

AI智能名片小程序源码在付费媒体与企业营销策略中的创新应用

摘要:在数字化浪潮的推动下,付费媒体已成为企业营销战略的核心组成部分。从视频流媒体平台到社交媒体,企业需不断探索新颖且高效的营销手段以吸引目标受众并促进业务增长。AI智能名片小程序源码,作为融合人工智能、小程序技术与传…

什么是实时数据仓库?它有哪些不可替代之处?

【实时数据仓库】可以分开来理解: ✅【实时数据】:即能够快速处理数据,且几乎无延迟的提供最新的数据的能力。 ✅【仓库管理】:可以理解为对仓库的库存控制、对仓库的存储优化以及协调物流。 那么实时数据仓库就是:…

Windows 找不到音频输入/输出设备

0.具体现象 系统音量为0,且无法通过任何方式调整。音量表示非静音表示,而是下图这个叉。 1. 解决方案 以Windows 11电脑为例,从搜索框输入【设备管理器】,进入界面如下: 发现一个感叹号的设备【Intel High Defini…

对象与类的一些基本定义与例子(C++)

1.例题要求,设计一个学生类,实例化对象,并且进行赋值 我们通过创建学生的类,给予了学生名字和年龄的两个属性,我们在main函数中创建了学生类的对象s1,通过s1调用了学生类的属性并给予赋值,最后调用学生类打…

Nginx统计PV、NV

目录 PV 分析 UV 分析 在 Nginx 的配置文件中设置 access_log 主要涉及到以下几个方面: 以下是一个基本的 access_log 配置示例: 使用命令行工具对日志进行基本分析: 后端记录 对于 nginx 的 access.log 日志,我们可以根据日…

进程的等待(非阻塞轮询+阻塞)和替换控制详解

引言 在Linux系统中,进程管理是核心功能之一。理解进程的创建、执行和终止是系统编程中的基础。本文将深入探讨Linux中的进程控制机制,包括进程的生命周期、父子进程的交互、以及进程状态的管理 1. 进程创建:fork()函数 在Linux操作系统中…

Prompt万能框架与常用评估指标

引言 在人工智能的飞速发展中,大型语言模型(LLM)已成为研究和应用的热点。LLM以其强大的语言理解和生成能力,在诸如自然语言处理、文本生成、问答系统等多个领域展现出巨大潜力。然而,要充分发挥LLM的能力&#xff0c…

NSSCTF练习记录:[SWPUCTF 2021 新生赛]caidao

题目: 图片上给出了代码,是php的一句话木马 eval($_POST[wllm]);符号 符号表示后面的语句即使执行错误,也不报错。 eval()函数 eval()函数的作用是把括号内的字符串全部当作php代码来执行。 ** P O S T [ ′ w l l m ′ ] ∗ ∗ p o s t …

一起学习LeetCode热题100道(30/100)

30.两两交换链表中的节点(学习) 给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。 示例 1: 输入:head …

【LVS】调度算法概念

fd相当于静态 ovf相当于动态

界面控件DevExpress WinForms,支持HTML CSS提升用户体验(二)

DevExpress WinForms现在可以利用HTML/CSS强大的功能,帮助受DevExpress驱动的WinForms应用程序引入现代的UI元素和用户体验! P.S:DevExpress WinForms拥有180组件和UI库,能为Windows Forms平台创建具有影响力的业务解决方案。Dev…

室内定位导航技术:蓝牙信号强度(RSSI)与三角定位算法应用

在数字化时代,位置服务已成为连接物理世界与数字世界的桥梁。在室内环境中,由于GPS信号受建筑物遮挡而失效,传统的室外定位技术难以满足需求,无法精准指引我们在商场、机场、医院等庞大而复杂的建筑内部寻路。室内定位导航技术不仅…

在 Manim 中,kwargs 传递的关键字参数

在 Manim 中,kwargs 用于传递关键字参数,常用于构造对象时。这里的关键参数有那些。我都要,给我整理一下 Sider Fusion 在 Manim 中,kwargs 允许您传递可选的关键字参数来控制动画、对象的外观和行为。尽管具体可用的参数会因对象…

【开端】通过Java 过滤器灵活配置URL访问权限,并返回403

一、绪论 在JAVA项目系统中,后端给前端提供接口。但是在某些场景我们需要临时控制接口是否能被访问。或关闭某一接口的访问权限。 比如某一接口被攻击了或者某一接口存在漏洞,在系统不关闭的情况下,如何控制系统的访问权限。 二、控制接口访…