序列:列表 元组 字符串 bytes.
序列化里面的序列特指的就是字符串和bytes.
把其它的数据类型转换成字符串和bytes的过程就是序列化的过程.
直接序列化的一个例子:
dic = {‘1‘:‘2‘}
print([str(dic),dic])#序列化
import json
‘‘‘
为什么要把其它数据类型转换成字符串?
转字符串的过程不就是数据类型的强制转换吗?为啥要学json和pickle模块呢?
网络上只能传输的是bytes类型.
存储在文件里只是bytes和str(本质是bytes)
最好的传输模式:字典->字符串->通过网络传输->字典->字符串
eval要谨慎使用:不可以用在:a.用户输入的b.网络上接收的数据c.文件中的内容
正常人不会用eval作序列化,但已知的代码但需要y一些拼接,根据自己的逻辑去做拼接.
所以要有序列化模块
‘‘‘
dic = {‘key‘:‘value1‘,‘key2‘:‘value2‘}
import json
ret = json.dumps(dic)#序列化
print(dic,type(dic))#{‘key‘: ‘value1‘, ‘key2‘: ‘value2‘} <class ‘dict‘>
# print(ret,type(ret))#{"key": "value1", "key2": "value2"} <class ‘str‘>
res = json.loads(ret)
print(res,type(res))#可以直接使用,反序列化
# json.loads()
#问题1
dic1 = {1:‘value1‘,2:‘value2‘}
ret1 = json.dumps(dic1)
print(1,json.loads(ret1),type(json.loads(ret1)))#将1和2也变成了字符串
#问题2
dic2 = {1:[1,2,3],2:(4,5,6)}
ret2 = json.dumps(dic2)
print(2,json.loads(ret2),type(json.loads(ret2)))#(4,5,6)变成了[4,5,6]
#问题3
# set3 = {1,2,‘aa‘}
# json.dumps(set3)#{1, 2, ‘aa‘} is not JSON serializable
#问题4 #keys must be a string
# json.dumps({(1,2,3):123})#keys must be a string
#json能够处理的数据类型是非常有限的,只支持字符串,列表,字典,数字.json序列化的数据在各种数据中都可以反序列化.因为要和别的语言通讯.
# 字典中的key只能是字符串
# 别的语言的例子->前端语言:在网页上做展示的 但本质上都是数据传输
#向文件当中记录字典,再从文件中读取字典ok.
#问题5
retp = json.dumps(dic)
with open(‘dic.dump‘,‘a‘,encoding=‘utf-8‘) as f:#一般是a而不是a+
# f.write(retp)#可以用json(dic,f)替换
with open(‘dic.dump‘,‘r‘,encoding=‘utf-8‘) as fr:
retr = fr.read()#这里自己添加的话,必须用双引号去表示字符串,#可以用 dic = json.load(fr)替换
# dict = json.loads(retr)
# print(dic.keys())
#dump load 直接操作文件,dumps和loads直接操作内存(针对数据)
#可以多次将数据dump进文件,而不能多次load数据(只能load一个变量),计算机不识别.
#不支持连续的存和取的,这时候只能用dumps和loads来实现这功能
# with open(‘dic.dump‘,‘r‘) as five_file:
# dic_5 = json.load(five_file)
# dic_5 = json.load(five_file)#报错
#想要把一个个的字典放到文件中再一个个拿出来怎么办?
#解决方法,+分隔符再一行一行的读取数据,(用dumps和loads来执行)
with open(‘dic.dump‘,‘a‘) as fa:
dic_dump_write = json.dumps(dic2)
fa.write(dic_dump_write+‘\n‘)
fa.write(dic_dump_write+‘\n‘)
with open(‘dic.dump‘, ‘r‘) as fr1:
for line in fr1:
json.loads(line)
json.loads(line)
‘‘‘
json
dumps loads->针对数据
在内存中做数据转换:
dumps 数据类型转换成字符串 序列化
loads 字符串转成数据类型 反序列化
dump load->针对文件
直接将数据类型写入文件 从文件中读出数据列席
json 是所有语言都通用的一种序列化格式
只支持列表,字典,字符串,数字
字典的key必须是str
‘‘‘
dic_test = {1:‘无敌‘}
print(json.dumps(dic_test,ensure_ascii=False))#不然‘无敌‘是编码形式显示
import json
data = {‘username‘:[‘李华‘,‘二愣子‘],‘sex‘:‘male‘,‘age‘:16}
#格式化序列化
json_dic2 = json.dumps(data,sort_keys=True,indent=2,separators=(‘,‘,‘:‘),ensure_ascii=False)#indent缩进数 seperator(‘换行分割符‘,‘key和value分割符‘),sort_keys:根据key去排序
print(json_dic2)
‘‘‘
结果:
{
"age":16,
"sex":"male",
"username":[
"李华",
"二愣子"
]
}
‘‘‘
#一般情况下要存文件,从网络上传,都不关心这些格式了.若是格式化容易增加空间开销.
import pickle
#支持在python中几乎所有的数据类型
dic = {(1,2,3):{‘a‘:‘b‘},1:‘abc‘}#json模块无法处理
dic1 = {(1,2,3):{‘a‘:‘b‘},2:‘abc‘}#json模块无法处理
dic2 = {(1,2,3):{‘a‘:‘b‘},3:‘abc‘}#json模块无法处理
ret = pickle.dumps(dic)
print(ret)#bytes类型
#1.pickle dumps的结果永远是字节,看不见结果,且无法解码.
print(pickle.loads(ret))
#2.只有pickle.loads可以认识这些字节
#3.只能在python中使用
#4.在和文件操作的时候,要用wb,rb的模式打开文件.
#dump load
# with open(‘pickle_file‘,‘wb‘) as pickle_open:
# pickle.dump(dic,pickle_open)
# pickle.dump(dic1,pickle_open)
# pickle.dump(dic2,pickle_open)
# with open(‘pickle_file‘,‘rb‘) as pickle_open:
# ret1 = pickle.load(pickle_open)
# print(ret1,type(ret1))#{1: ‘abc‘, (1, 2, 3): {‘a‘: ‘b‘}} <class ‘dict‘>
# ret1 = pickle.load(pickle_open)
# print(ret1,type(ret1))#{2: ‘abc‘, (1, 2, 3): {‘a‘: ‘b‘}} <class ‘dict‘>
#可以多次load,对应上次dump的次数.若是load次数超过dump次数则报错.
#报错的解决方法
with open(‘pickle_file‘,‘rb‘) as pickle_open:
while 1 :
try:
ret1 = pickle.load(pickle_open)
print(ret1,type(ret1))
except EOFError:
break
‘‘‘ os 和操作系统交互 文件夹和文件的处理 :创建文件夹 删除文件夹 重命名文件 删除文件 listdir stat 路径的处理 : 路径的拼接/拆分 计算大小 判断目录是否存在/是文件/是文件夹 绝对路径相关 执行操作系统命令 : 和执行路径相关 执行命令的 序列化模块 json/pickle dump/load 文件中 <-> 其他数据类型 文件中 <-> 字符串/字节 <-> 其他数据类型 dumps/loads 字符串/字节 <-> 其他数据类型 json 通用的/支持的数据类型少 pickle python专用的/支持几乎所有数据类型 ‘‘‘
原文:https://www.cnblogs.com/negu/p/11732834.html