python序列化模块

1. 序列化一般用于二个地方:

1> 数据存储,如写文件,数据入库

2> 网络上传输数据的时候

2. 序列化/反序列化:

1> 序列化:从数据类型(int,dict,tuple,list等) --> 字符串的过程

2> 反序列化:从字符串 --> 数据类型的过程

3. json (常用模块):

1> 通用的序列化格式

2> 只有很少的一部分数据类型能通过json转化为字符串

3>  json能序列化的数据类型有:数字,字符串,列表,字典,元组(序列化时当成列表序列化的)

#json  dumps序列化方法  loads反序列化方法
import json
dic={"k":"v"}
print(type(dic),dic)

str_d=json.dumps(dic)  #序列化
print(type(str_d),str_d)
#json格式: ‘{"k1":"v1"}‘ , 外面是一个单引号,内部的所有字符串都要使用双引号引起来

dic_d=json.loads(str_d)  #反序列化
print(type(dic_d),dic_d)

4> dump:将数据序列化到文件中(只有字符串才能写入文件)

import  json

# dump:与文件相关的操作
dic = {‘a‘:‘中国‘,‘b‘:‘22‘}
f=open(‘ff‘,‘w‘,encoding=‘utf-8‘)

json.dump(dic,f,ensure_ascii=False)  #序列化, ensure_ascii为False时,中文字符写入文件中后仍为中文
f.close()

5> load: 将文件中的字符中反序列化成原数据类型的数据

import json

f=open(‘ff‘,‘r‘,encoding=‘utf-8‘) #ff是一个已存的文件,写了一个字典的数据 dic_d =json.load(f) #反序列化
f.close()
print(type(dic_d),dic_d)

    重点:

            a> dumps/loads: 直接操作内存中的数据类型;

            b> dump/load:直接操作文件中的数据;

            c> dump/load:dump可以将多次写入内容到文件中,但是写入后,load无法多次读出,因为不知道每次读到哪里;

            d> 所以dump和load使用时,一次性写入全部内容,再一次性读出所有内容;

    6> 如果想多次写入内容后,再多次读出来,怎么办?

import  json

#一个一个字典的写入
list_1 = [{‘a‘:‘中国‘},{‘b‘:‘22‘},{‘c‘:‘33‘}]
f=open(‘ff‘,‘w‘,encoding=‘utf-8‘)
for dic in list_1:
    str_dic=json.dumps(dic,ensure_ascii=False)
    f.write(str_dic+‘\n‘)
f.close()

#一行一行读出
f=open(‘ff‘,encoding=‘utf-8‘)
list_2=[]
for line in f:
    dic=json.loads(line.strip()) #strip()去掉换行
    list_2.append(dic)
f.close()
print(list_2)

4. pickle:

1> 所有的python中的数据类型都可以通过pickle转化成字符串;

2> pickle序列化的内容只有python能识别;

3> 部分反序列化依赖python代码;

4> 同json一样,常用方法有 dumps/loads,dump/load;

5> dumps出来的内容为base格式(二进制)字符串;

6> dump和load时,对于文件的写入和读出,要用‘wb‘和‘rb’形式;

7> dump和load,可以多次dump内容写入文件,再多次load从文件中读出;

import  pickle,time
struct_time1=time.localtime(1000000000)
struct_time2=time.localtime(2000000000)
print(struct_time1)
print(struct_time2)
f=open(‘pickle_file‘,‘wb‘)
pickle.dump(struct_time1,f)  #可以多次dump写入
pickle.dump(struct_time2,f)
f.close()

f=open(‘pickle_file‘,‘rb‘)
struct_time1=pickle.load(f)  #再多次load读出
struct_time2=pickle.load(f)
print(struct_time1.tm_year)
print(struct_time2.tm_year)

5. shelve:

1> 操作简单,序列化句柄;

2> 使用句柄直接操作,非常方便;

3> 只有一个open方法,通过key来访问,用法类似字典;

import shelve
f=shelve.open(‘shelve_file‘)
f[‘firt‘]={‘int‘:10,‘float‘:9.5,‘string‘:‘Sample data‘} #直接对文件句柄f操作,就可以存入数据
f[‘second‘]={1,2.4,‘aa‘,(‘中国‘,‘bb‘)} #写入后,会生成一些后缀为.bak,.dat,.dir文件
f.close()

f1=shelve.open(‘shelve_file‘)
existing1=f1[‘firt‘] #取出数据时也只需要直接用key获取即可,但是若key不存在会报错
existing2=f1[‘second‘]
f1.close()
print(existing1)
print(existing2)

4> shelve在默认情况下不会记录持久化对象的任务修改,需要在shelve.open()时修改默认参数writeback,否则对象的修改不会保存

import shelve
f1=shelve.open(‘shelve_file‘)
print(f1[‘firt‘])
f1[‘firt‘][‘new_value‘]=‘this was a new add value‘
print(f1[‘firt‘]) #新增加的内容没有保存下来
f1.close()

import shelve
f1=shelve.open(‘shelve_file‘,writeback=True)
print(f1[‘firt‘])
f1[‘firt‘][‘new_value‘]=‘this was a new add value‘
print(f1[‘firt‘]) #新增加的内容保存下来了!!
f1.close()

5> writeback优化点:

a> 优化:让对象的持久化对用户更加的透明了;

b> 缺点:shelve在open()时增加额外内存,当DB在close()时,会将缓存中每个对象都重新写入DB,因为shelve无法知道缓存中哪些对象修改了,哪些对象没有修改;

原文地址:https://www.cnblogs.com/quiet-sun/p/12307563.html

时间: 2024-10-11 13:12:47

python序列化模块的相关文章

25.Python序列化模块,hashlib模块, configparser模块,logging模块,异常处理

一.序列化模块 什么叫序列化——将原本的字典.列表等内容转换成一个字符串的过程就叫做序列化. 比如,我们在python代码中计算的一个数据需要给另外一段程序使用,那我们怎么给?现在我们能想到的方法就是存在文件里,然后另一个python程序再从文件里读出来.但是我们都知道,对于文件来说是没有字典这个概念的,所以我们只能将数据转换成字典放到文件中.你一定会问,将字典转换成一个字符串很简单,就是str(dic)就可以办到了,为什么我们还要学习序列化模块呢?没错序列化的过程就是从dic 变成str(di

Python序列化模块pickle和json使用和区别

这是用于序列化的两个模块: ? json: 用于字符串和python数据类型间进行转换 ? pickle: 用于python特有的类型和python的数据类型间进行转换 Json模块提供了四个功能:dumps.dump.loads.load pickle模块提供了四个功能:dumps.dump.loads.load 那pickle和json有什么区别呢? json是可以在不同语言之间交换数据的,而pickle只在python之间使用. json只能序列化最基本的数据类型,而pickle可以序列化

python序列化模块json和pickle

序列化相关 1. json 应用场景: json模块主要用于处理json格式的数据,可以将json格式的数据转化为python的字典,便于python处理,同时也可以将python的字典或列表等对象转化为json格式的数据,便于跨平台或跨语言进行数据交互 功能: Json模块提供了四个功能:dumps.dump.loads.load Python 编码为 JSON 类型转换对应表: Python JSON dict object list, tuple array str string int,

[ python ] 序列化模块

什么叫序列化:    将原本的字典.列表等内容转换成一个字符串的过程就叫做序列化. 序列化的目的:    1. 以某种存储形式使自定义对象持久化    2. 将对象从一个地方传递到另一个地方    3. 使程序更具维护性 json 模块 json模块提供了四个功能:dumps.loads 和 dump.load import json dic = {'k1':1, 'k2': 2, 'k3': 3} # 序列化 str_dic = json.dumps(dic) # dumps 就是将字典类型转

Python序列化模块-Pickel写入和读取文件

利用pickle 存储和读取文件 1.存储文件: #引入所需包,将列表元素存入data2的文件里面 import pickle mylist2 ={'1','nihao','之后','我们',1,2,3,4} #不可以存list pk_file = open(r'c:\Temp\pickel.txt', 'wb') # 注意一定要写明是wb 而不是w. #最关键的是这步,将内容装入打开的文件之中(内容,目标文件) pickle.dump(mylist2, pk_file) #必须内容在前,文件名

python开发模块基础:序列化模块json,pickle,shelve

一,为什么要序列化 # 将原本的字典.列表等内容转换成一个字符串的过程就叫做序列化'''比如,我们在python代码中计算的一个数据需要给另外一段程序使用,那我们怎么给?现在我们能想到的方法就是存在文件里,然后另一个python程序再从文件里读出来.但是我们都知道,对于文件来说是没有字典这个概念的,所以我们只能将数据转换成字典放到文件中.你一定会问,将字典转换成一个字符串很简单,就是str(dic)就可以办到了,为什么我们还要学习序列化模块呢?没错序列化的过程就是从dic 变成str(dic)的

Python模块-logging、序列化模块、re模块

MarkdownPad Document logging模块 import logging   logging.debug('debug message')   logging.info('info message')   logging.warning('warning message')   logging.error('error message')   logging.critical('critical message') 运行结果: C:\Python36\python.exe C:

python模块之sys模块和序列化模块

sys模块 sys模块是与python解释器交互的一个接口 sys.argv 命令行参数List,第一个元素是程序本身路径 sys.exit(n) 退出程序,正常退出时exit(0),错误退出sys.exit(1) sys.version 获取Python解释程序的版本信息 sys.path 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值 sys.platform 返回操作系统平台名称 序列化模块 序列化的目的: 以某种存储形式使自定义对象持久化 将对象从一个地方传递到另一个地

python之模块 marshal(序列化)---没理解

# -*- coding: utf-8 -*- #python 27 #xiaodeng #python之模块 marshal(序列化) #来自:mldxs import marshal data1 = ['abc',12,23,'jb51'] data2 = {1:'aaa',"b":'dad'} data3 = (1,2,4) output_file = open("a.txt",'wb')#把这些数据序列化到文件中,注:文件必须以二进制模式打开 marshal