15. 序列化模块json和pickle、os模块

news/2025/1/19 11:22:05/文章来源:https://www.cnblogs.com/hbutmeng/p/18337015

1. 序列化模块

 1.1 序列化与反序列化

(1)序列化

将原本的python数据类型字典、列表、元组 转换成json格式字符串的过程就叫序列化

(2)反序列化

将json格式字符串转换成python数据类型字典、列表、元组的过程就叫反序列化

(3)为什么要序列化

计算机文件中没有字典这种数据类型,将字典中的数据转换成字符串形式的数据就称为序列化

1.2 json模块

json格式的数据在几种不同的语言中是一个通用的数据格式

(1)将python数据转换成json格式的字符串

import json
a = {'name': 'messi', 'age': 37, 'club': 'miami', 'address': 'usa'}# 将python数据转换为json字符串
b = json.dumps(a)
print(b, type(b))  # {"name": "messi", "age": 37, "club": "miami", "address": "usa"} <class 'str'># 将json字符串转换为python数据
c = json.loads(b)
print(c, type(c))  # {'name': 'messi', 'age': 37, 'club': 'miami', 'address': 'usa'} <class 'dict'># 将json字符串进行二进制编码,符合json格式的二进制数据也能转换为python数据
d = b.encode()
print(d, type(d))  # b'{"name": "messi", "age": 37, "club": "miami", "address": "usa"}' <class 'bytes'>
e = json.loads(d)
print(e, type(e))  # {'name': 'messi', 'age': 37, 'club': 'miami', 'address': 'usa'} <class 'dict'>

(2)json模块处理文件

import json
a = {'name': 'messi', 'age': 37, 'club': 'miami', 'address': 'usa'}
# 将python数据写入到json文件中
# 字典格式的单引号变成了双引号
with open('new.json', 'w', encoding='utf-8') as f:json.dump(a, f, ensure_ascii=False)
# {"name": "messi", "age": 37, "club": "miami", "address": "usa"}# 将json文件的数据转换成python数据
# json格式字典双引号变成了单引号
with open('new.json', 'r', encoding='utf-8') as f2:data = json.load(f2)
print(data, type(data))  # {'name': 'messi', 'age': 37, 'club': 'miami', 'address': 'usa'} <class 'dict'>

python中的列表存到json中还是列表,python中的元组存到json中也成了列表

(3)python数据与json数据互转

from json.encoder import JSONEncoder
from json.decoder import JSONDecodeError'''+-------------------+---------------+| Python            | JSON          |+===================+===============+| dict              | object        |+-------------------+---------------+| list, tuple       | array         |+-------------------+---------------+| str               | string        |+-------------------+---------------+| int, float        | number        |+-------------------+---------------+| True              | true          |+-------------------+---------------+| False             | false         |+-------------------+---------------+| None              | null          |+-------------------+---------------+
'''
# 将 Python中的 字典 转换为JSON格式的字典
# 将 Python中的 元组和列表 转换为 JSON格式的列表
# 将 Python中的 字符串 转换为 JSON格式的字符串
# 将 Python中的 布尔值 True / False 转换为 JSON格式的 true / false
# 将 Python中的 None 转换为 JSON格式的 null
# 将 Python中的 整数 转换为 JSON格式的数字

(4)json参数补充

# json模块默认的编码格式是ASCII码
# 写数据的时候再在open参数中指定utf-8是不生效的
import json
a = {'name': 'messi', 'club': '迈阿密', 'num': '001'}
with open('new.json', mode='w', encoding='utf-8') as f1:json.dump(a, f1)
# {"name": "messi", "club": "\u8fc8\u963f\u5bc6", "num": "001"}# 于是就要对dump参数进行调整
with open('new.json', mode='w', encoding='utf-8') as f2:json.dump(a, f2, ensure_ascii=False)
# ensure_ascii=True : 是否启用默认的编码格式 如果是 True 则默认使用 ASCII 码格式,如果是 False 则使用 Unicode 格式
# {"name": "messi", "club": "迈阿密", "num": "001"}

1.3 pickle模块

pickle模块和json模块都是用来序列化和反序列化python数据的

json处理不了python中的函数和类,于是有了pickle

‌pickle格式是一种用于序列化和反序列化‌Python对象的二进制格式。

(1)将python数据转换成二进制数据

import pickle
def add(x, y):return x + ya = pickle.dumps(obj=add)
print(a, type(a))
# b'\x80\x04\x95\x14\x00\x00\x00\x00\x00\x00\x00\x8c\x08__main__\x94\x8c\x03add\x94\x93\x94.' <class 'bytes'>

b = pickle.loads(a)
print(b, type(b))
# 得到一个内存地址,为函数类型
# <function add at 0x000001F7ABBE3370> <class 'function'>

(2)将python数据转换成二进制数据并写入文件

import pickle
def add(x, y):print(x + y)# 生成的aaa文件不可打开,但是可调用
with open('aaa', 'wb') as f1:  # 由于pickle是将python数据序列化为二进制,因此写模式为wb
    pickle.dump(add, f1)with open('aaa', 'rb') as f2:new_add = pickle.load(f2)
print(new_add, type(new_add))
# <function add at 0x000001D099E83370> <class 'function'>
# pickle先将函数名转换成二进制写到文件中,后将文件中二进制数据转换为函数名
new_add(11, 22)  # 33  转回的函数仍旧可调用

2. os模块

os模块用于与操作系统交互

2.1  os.path.*

import os
import datetime# (1)os.path.abspath  获取当前文件的绝对路径
print(os.path.abspath(__file__))  # D:\project\pythonProject\day14_部分模块\test.py# (2)os.path.dirname  获取当前文件所在文件夹的绝对路径
print(os.path.dirname(__file__))  # D:\project\pythonProject\day14_部分模块# (3)os.path.exists   判断文件夹是否存在
a = 'D:\project\pythonProject\day14_部分模块'
print(os.path.exists(a))  # True
b = 'D:\project\pythonProject\day14_usual'
print(os.path.exists(b))  # False# (4)os.path.join   拼接文件路径
c = os.path.join('D:\project\pythonProject\day14_部分模块', 'giao')
print(c)  # D:\project\pythonProject\day14_部分模块\giao
print(os.path.exists(c))  # False# (5)os.path.split  将路径分隔为最后一级和上一级并以二元元组返回
d = os.path.split('D:\project\pythonProject\day14_部分模块\\test.py')  # 加一个反斜杠取消转义
print(d)  # ('D:\\project\\pythonProject\\day14_部分模块', 'test.py')
e = os.path.split('D:\project\pythonProject\day14_部分模块')
print(e)  # ('D:\\project\\pythonProject', 'day14_部分模块')# (6)os.path.basename  获取最后一级文件名/目录名
f = os.path.basename('D:\project\pythonProject\day14_部分模块\\test.py')
print(f)  # test.py
g = os.path.basename('D:\project\pythonProject\day14_部分模块')
print(g)  # day14_部分模块# (7)os.path.isfile  判断当前路径是否为文件
h = os.path.isfile('D:\project\pythonProject\day14_部分模块\\test.py')
print(h)  # True
i = os.path.isfile('D:\project\pythonProject\day14_部分模块')
print(i)  # False# (8)os.path.isabs  判断是否为绝对路径
j = '.\\test.py'
print(os.path.isabs(j))  # False
print(os.path.isabs('D:\project\pythonProject\day14_部分模块\\test.py'))  # True# (9)os.path.isdir  判断是否为目录
print(os.path.isdir('D:\project\pythonProject\day14_部分模块\\test.py'))
# False
print(os.path.isdir('D:\project\pythonProject\day14_部分模块'))
# True# (10)os.path.getatime  获取当前文件或目录的最后访问时间atime---access time
k = os.path.getatime('D:\project\pythonProject\day14_部分模块\\test.py')
print(k)  # 1722512134.9196131
print(datetime.datetime.fromtimestamp(k))  # 2024-08-01 19:35:34.919613# (11)os.path.getctime  获取当前文件或目录的创建时间ctime---create time
l = os.path.getctime('D:\project')
print(l)  # 1721123236.0086133
print(datetime.datetime.fromtimestamp(l))  # 2024-07-16 17:47:16.008613# (12)os.path.getmtime  获取当前文件或目录的修改时间mtime---modifytime
m = os.path.getmtime('D:\project\pythonProject')
print(m)  # 1722504598.081404
print(datetime.datetime.fromtimestamp(m))  # 2024-08-01 17:29:58.081404# (13)os.path.getsize  获取当前文件或目录的大小,单位为byte
print(os.path.getsize('D:\project\pythonProject\day14_部分模块\\test.py'))  # 2975# (14)os.path.sep 获取系统对应的路径分隔符  MacOs、Linux:  /        Windows:   \
print(os.path.sep)  # \

2.2  路径操作 os.*

(1)创建单级文件夹

import osCURRENT_DIR = os.path.dirname(os.path.abspath(__file__))  # 获取当前文件所在的目录
print(CURRENT_DIR)  # D:\project\pythonProject\day14_部分模块
# (1)创建单级文件夹
new_dir = os.path.join(CURRENT_DIR, 'giao')  # 只是拼接了并没有创建
print(new_dir)  # D:\project\pythonProject\day14_部分模块\giao
print(os.path.exists(new_dir))  # False

os.mkdir(new_dir)  # 真正生成了新的文件夹
print(os.path.exists(new_dir))  # True

(2)创建多级文件夹

import osCURRENT_DIR = os.path.dirname(os.path.abspath(__file__))  # 获取当前文件所在的目录
new_dir = os.path.join(CURRENT_DIR, 'giu', 'giao')  # 在当前文件所在目录再往下拼接两级目录
print(new_dir)  # D:\project\pythonProject\day14_部分模块\giu\giao
print(os.path.exists(new_dir))  # False

os.makedirs(new_dir)  # 创建拼接好的两个目录
print(os.path.exists(new_dir))  # True 
import osCURRENT_DIR = os.path.dirname(os.path.abspath(__file__))  # 获取当前文件所在的目录
new_dir = os.path.join(CURRENT_DIR, 'giu', 'giao')  # 在当前文件所在目录再往下拼接两级目录
print(new_dir)  # D:\project\pythonProject\day14_部分模块\giu\giao
print(os.path.exists(new_dir))  # False

os.makedirs(new_dir, exist_ok=True)
# exist_ok=True  自动判断当前文件路径是否存在,如果不存在则主动创建,如果存在则忽略

(3)删除单级文件夹

import osCURRENT_DIR = os.path.dirname(os.path.abspath(__file__))  # 获取当前文件所在的目录
new_dir = os.path.join(CURRENT_DIR, 'giu', 'giao')  # 在当前文件所在目录再往下拼接两级目录
os.makedirs(new_dir, exist_ok=True)
print(new_dir)  # D:\project\pythonProject\day14_部分模块\giu\giao# os.rmdir   只能删除单级文件夹且单级文件夹为空
os.rmdir(new_dir)  # D:\project\pythonProject\day14_部分模块\giu
print(os.path.exists(new_dir))  # False

os.rmdir('D:\project\pythonProject\day13_模块与包')  # OSError: [WinError 145] 目录不是空的。

(4)删除多级文件夹

import osCURRENT_DIR = os.path.dirname(os.path.abspath(__file__))  # 获取当前文件所在的目录
new_dir = os.path.join(CURRENT_DIR, 'giu', 'giao')  # 在当前文件所在目录再往下拼接两级目录
os.makedirs(new_dir, exist_ok=True)
print(new_dir)  # D:\project\pythonProject\day14_部分模块\giu\giao# os.removedirs  若目录为空,则删除,并递归到上一级目录,若也为空,则删除,以此类推
os.removedirs(new_dir)  # D:\project\pythonProject\day14_部分模块

(5)列出当前目录下的所有文件名

import os# listdir的用法
print(os.path.dirname(os.path.abspath(__file__)))  # 获取当前文件所在目录
print(os.listdir(os.path.dirname(os.path.abspath(__file__))))  # ['new.json', 'task.py', 'test.py']

(6)重命名当前文件或目录

rename的用法

重命名目录
import osCURRENT_DIR = os.path.dirname(os.path.abspath(__file__))  # 获取当前文件所在的目录
new_name = os.path.join(CURRENT_DIR, 'giao')  # 在当前文件所在目录再拼接一个目录
os.makedirs(new_name, exist_ok=True)
print(new_name)  # D:\project\pythonProject\day14_部分模块\giao

new_name2 = os.path.join(CURRENT_DIR, 'giu')  # 拼接一个新的名称
print(new_name2)  # D:\project\pythonProject\day14_部分模块\giu
os.rename(new_name, new_name2)  # 用最新的替换原来的
重命名文件名
import osCURRENT_FILE = os.path.abspath(__file__)  # 获取当前文件绝对路径
print(CURRENT_FILE)  # D:\project\pythonProject\day14_部分模块\task.py

CURRENT_DIR = os.path.dirname(os.path.abspath(__file__))  # 获取当前文件所在的目录
new_filename = os.path.join(CURRENT_DIR, 'workon.py')  # 拼接一个新的文件名称
print(new_filename)  # D:\project\pythonProject\day14_部分模块\workon.py
os.rename(CURRENT_FILE, new_filename)  # 用新的名称替换原来的

(7)删除指定文件

os.remove的用法

 (8)列出当前文件的元信息

import osprint(os.stat(os.path.abspath(__file__)))
# st_mode: inode 保护模式
# st_ino: inode 节点号。
# st_dev: inode 驻留的设备。
# st_nlink: inode 的链接数。
# st_uid: 所有者的用户ID。
# st_gid: 所有者的组ID。
# st_size: 普通文件以字节为单位的大小;包含等待某些特殊文件的数据。
# st_atime: 上次访问的时间。
# st_mtime: 最后一次修改的时间。
# st_ctime: 由操作系统报告的"ctime"。在某些系统上(如Unix)是最新的元数据更改的时间

(9)获取当前所在的工作目录

import osprint(os.getcwd())  # D:\project\pythonProject\day14_部分模块

(10)切换工作目录

import osprint(os.getcwd())  # 当前路径 D:\project\pythonProject\day14_部分模块
os.chdir('D:\project\pythonProject\day13_模块与包')  # 切换路径
print(os.getcwd())  # D:\project\pythonProject\day13_模块与包

(11)执行shell命令

操作系统不同则命令名称也不同

 (12)执行命令获取结果

import osres = os.system('dir')
print(res)

2.3 os模块操作补充

# (1)获取操作系统的路径分隔符
import osprint(os.sep)  # \
print(os.path.sep)  # \
# (2)获取操作系统的行终止符
import osprint(os.linesep)  # \r\n

# (4)查看操作系统的标识
import osprint(os.name)  # nt

 

 

 

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

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

相关文章

AI表情神同步!LivePortrait安装配置,一键包,使用教程

快手在AI视频这领域还真有点东西,视频生成工具“可灵”让大家玩得不亦乐乎。现在又开源了一款超好玩的表情同步(表情控制)项目。 一看这图片,就知道是小视频平台出的,充满了娱乐性。发布没几天就已经有8000+Star。项目简介 LivePortrait 是一款由快手团队开发的高效肖像动…

右下角wifi图案点击无可用wifi/更新网卡驱动时遇到错误代码56的解决办法

1.问题 如下图所示,我这里遇到明明有wifi,但是无法检索到任何有用wifi的情况。2.解决方法 参考:电脑WIFI消失,网卡驱动Intel(R) Wi-Fi 6 AX201 160MHz感叹号报错 解决方案集合 —— 无线WI-FI功能缺失,Intel(R) Wi-Fi 6 AX201 160MHz异常,驱动更新错误 2.1 问题原因 当时…

单例模式及其思想

本文包括以下几点↓结论:设计模式不是简单地将一个固定的代码框架套用到项目中,而是一种严谨的编程思想,旨在提供解决特定问题的经验和指导。 单例模式(Singleton Pattern) 意图 旨在确保类只有一个实例,并提供一个全局访问点以访问该实例。 适用性 当你希望系统中只有一…

数组part02

2024年8月1日,今天学习了数组的第二部分。 1.巩固了昨天的双指针问题,即滑动窗口/双指针;注意,双指针是为了减少for循环,使用的时候小心循环的写法和快慢指针的增长方法。 2.学习了数组模拟的螺旋矩阵问题,注意循环不变量; 3.学习了前缀和的方法,前缀和常用来解决区间和…

windwos文件句柄数限制

1、修改注册表,位置如下: HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows NT/CurrentVersion/Windows2、设置 1、GDIProcessHandleQuota此项设置GDI句柄数量,默认值为2710(16进制)/10000(10进制),该值的允许范围为 256 ~ 16384 ,将其调整为大于默认的10000的值。如果您的…

P5665 [CSP-S2019] 划分

讲解 P5665 [CSP-S2019] 划分。由朴素 dp 入手,先用二分优化,然后用走指针优化,之后注意到单调性,将状态数压缩,然后使用单调队列优化转移。思路: 首先求出 \(a\) 的前缀和数组 \(s\)。 考虑动态规划,令 \(dp_{i,j}\) 表示以 \(i\) 结尾,末尾有 \(j\) 个为一组的最小答…

「代码随想录算法训练营」第二十六天 | 贪心算法 part4

452. 用最少数量的箭引爆气球题目链接:https://leetcode.cn/problems/minimum-number-of-arrows-to-burst-balloons/ 题目难度:中等 文章讲解:https://programmercarl.com/0452.用最少数量的箭引爆气球.html 视频讲解:https://www.bilibili.com/video/BV1SA41167xe 题目状态…

dbnet crnn java中文ocr识别

Table of ContentsAbout Getting Started Result ContactAbout完整项目:https://github.com/jiangnanboy/dbnet_crnn_java本项目利用java,javacv,onnx以及djl矩阵计算等技术加载文本检测模型dbnet与文本识别模型crnn,完成ocr的识别推理。 包含模型的完整项目请从右侧releases…

变量及标识符

变量 变量的概念 内存中的一个存储区域 该区域的数据可以在同一类型范围内不断变化 变量是程序中最基本的存储单元。包含变量类型、变量名和存储的值 变量的作用: 用于在内存中保存数据 使用变量注意: Java中每个变量必须先声明,后使用 使用变量名来访问这块区域的数据 变量…

如何通过PowerShell批量修改O365用户的office phone属性值

我的博客园:https://www.cnblogs.com/CQman/ 如何通过PowerShell批量修改O365用户的office phone属性值? 需求信息:组织中的O365用户在创建时,已手动录入了办公电话(Office phone),现在需要在办公电话前面加上统一的数字,如“0571-0985”,以批量的方式统一修改。 备注:…