Python-数据导入导出:json模块,pickle模块

本文详细介绍了Python中json和pickle模块的使用,包括json的dumps、dump、loads、load方法以及pickle的dumps、dump、loads、load方法。json模块用于明文保存Python标准数据,而pickle模块则可以保存任何Python数据,包括类数据。通过实例展示了如何将数据存储到本地文件以及如何将数据作为程序的一部分。
摘要由CSDN通过智能技术生成

0 前言

数据导出是指将Python中的数据保存到本地文件,用于保存配制、和其他程序交互或者省略部分数据生成步骤

① 如果是纯字符串数据,直接读写本地txt文件就可以了

② 如果是Python标准数据,如字符串、数字、列表、字典等,推荐使用json模块明文保存到本地,也可以使用pickle模块以二进制形式保存到本地

③ 如果是无法被print显示的类数据,则只能使用pickle模块以二进制形式保存到本地

>>返回Python系列文章目录<<

1 json模块

JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式。Python3 中可以使用 json 模块来对 JSON 数据进行编解码,它主要提供了四个方法: dumpsdumploadsload

python数据类型与json数据类型的映射关系,json不区分tuple和list,统一按list处理
在这里插入图片描述

json模块是Python标准库,不需要安装,使用以下方式导入

import json

1.1 dumps()方法

json.dumps()方法可以将Python标准数据转为对应的json型字符串返回给一个变量,后续可以将这个变量写入文件

py_data = {"a": 1, "b": [2, 3], "c": (4, 5), "d": True, "e": None}
json_str = json.dumps(py_data)

with open('file.txt', 'w') as f:
    f.write(json_str)

结果:
在这里插入图片描述


json.dumps()方法默认输出紧凑型json字符串,可以通过indent参数选择缩进

indent默认为None,表示紧凑型

indent=0,表示在每个字典key或者每个列表元素前换行,不缩进

py_data = {"a": 1, "b": [2, 3], "c": (4, 5), "d": True, "e": None}
json_str = json.dumps(py_data, indent=0)

with open('file.txt', 'w') as f:
    f.write(json_str)

结果:
在这里插入图片描述

indent=4,表示在每个字典key或者每个列表元素前换行,且缩进4格

py_data = {"a": 1, "b": [2, 3], "c": (4, 5), "d": True, "e": None}
json_str = json.dumps(py_data, indent=4)

with open('file.txt', 'w') as f:
    f.write(json_str)

结果:
在这里插入图片描述

1.2 dump()方法

json.dump()方法可以将Python标准数据转为对应的json型字符串直接写入文件,需要提供文件句柄

py_data = {"a": 1, "b": [2, 3], "c": (4, 5), "d": True, "e": None}
with open('file.txt', 'w') as pf:
    json.dump(py_data, pf, indent=4)

1.3 loads()方法

json.loads()方法可以将json型字符串转为Python标准数据,json型字符串可以是从文件中读出

with open('file.txt', 'w') as f:
    json_str = f.read()
# json_str = '{"a": 1, "b": [2, 3], "c": [4, 5], "d": true, "e": null}'
py_data = json.loads(json_str)
print(py_data)
# py_data = {'a': 1, 'b': [2, 3], 'c': [4, 5], 'd': True, 'e': None}

1.4 load()方法

json.load()方法直接从文件中读取json数据转为Python标准数据,需要提供文件句柄

with open('file.txt', 'w') as pf:
    py_data = json.load(pf)

2 pickle模块

python的pickle模块可以在磁盘上以二进制形式保存任意Python数据,无论是普通数据还是类数据,并在需要的时候读取出来

pickle模块通常会在2种场景下使用:

  • 将Python的数据保存为磁盘上的二进制文件,需要时读取还原为Python数据,可以是可打印的基本数据(字符串、列表、字典等等),也可以是不可打印的类数据。相比之下,使用Json方式只能保存可打印的基本数据
  • 将已经创建好的类数据字符串化,保存为一个变量。在程序下次运行时直接读取变量还原为类数据,省去类数据的创建过程

pickle模块是Python标准库,不需要安装,使用以下方式导入

import pickle

pickle模块和json模块一样提供四个方法: dumpsdumploadsload

2.1 将Python数据存储为本地文件

设计一个程序,输出产物是Excel工作簿 output.xlsx,工作簿中有一个工作表 out_sheet 是从 标准文档 input.xlsx中中复制而来。

工作表 in_sheet 的内容很庞大,难以用手动重现,通常我们会选择将 标准文档 input.xlsx 作为程序的引用素材放在工程里。程序运行过程中将工作表 in_sheet复制到工作表 out_sheet中。

如果我们要求不能明文存储 标准文档 input.xlsx文件,只能存储工作表对应的Workbook()数据 ,将使用到pickle模块


① 存储过程

import pickle
from openpyxl import load_workbook

# 创建类数据
in_wb = load_workbook('input.xlsx')

# 将in_wb 转化为二进制数据
obj = pickle.dumps(in_wb)

# 将二进制数据存到本地文件,必须使用二进制写入
with open(file='data.txt', mode='wb') as f:
    f.write(obj)

此时,标准文档 input.xlsx 被存储到本地文件 data.txt,打开是二进制


② 加载过程

import pickle
from openpyxl.workbook.workbookimport Workbook

# 创建空的类数据准备接收数据,如果类有parent属性,必须和要接收的数据保持一致
in_wb= Workbook()

# 将本地文件数据加载到类数据上,必须使用二进制打开文件
with open(file='data.txt', mode='rb') as f:
    in_wb= pickle.loads(f.read())

2.2 将Python数据存储为程序的一部分

如果我们要求标准文档 input.xlsx文件的数据不但不能明文存储,还不能作为外部文件,必须作为 程序.exe 的一部分,以防丢失。有些小程序一共只有一个 exe文件,外挂一个文件不方便,此时可使用到pickle模块


① 存储过程

import pickle
from openpyxl import load_workbook

# 创建类数据
in_wb = load_workbook('input.xlsx')

# 将in_wb 转化为二进制数据
obj = pickle.dumps(in_wb)

# 将二进制数据存为py文件,必须使用文本写入
with open(file='in_workbook.py', mode='w') as f:
    # 将二进制数据转为 b'''xxx''' 字符串写入 py文件
    data = 'data=' + str(obj).replace('b\'', 'b\'\'\'') + '\'\''
    f.write(data)

此时,in_ws 被存储到本地文件in_workbook.py,内容是一串二进制码:

# in_workbook.py
data=b'''\x80\x04......'''

② 加载过程

将生成的 in_workbook.py 加载到程序中,直接读取数据

import pickle
from openpyxl.workbook.workbookimport Workbook
import in_workbook

# 创建空的类数据准备接收数据,如果类有parent属性,必须和要接收的数据保持一致
in_wb = Workbook()

# 直接读取in_workbook.py文件中的data变量
in_wb= pickle.loads(in_workbook.data)

in_workbook.py最终会被编译为程序的一部分


  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值