python学习15-序列化(转载)
序列化是指把内存里的数据类型转换成字符串,以使其能存储到硬盘或通过网络传输到远程,因为硬盘和网络传输时只能接受bytes
一、pickle
把python对象写入到文件中的一种解决方案,但是写入到文件的是bytes. 所以这东西不是给人看的. 是给机器看的.
##
bs = pickle.dumps(obj) 把对象转为bytes
obj = pickle.loads(bs) 把bytes转为对象
pickle.dump(obj,fielname) 把对象写入到文件
obj = pickle.load(filename) 从文件中拿对象
import pickle
class Cat:
def __init__(self,color,name):
self.name = name
self.color = color
def he(self):
print("喝水")
def chi(self):
print("%s吃小鱼" % self.name)
c = Cat('黑','小花')
print(c)
bs = pickle.dumps(c) #将对象转为bytes
# print(bs)
cc = pickle.loads(b'\x80\x03c__main__\nCat\nq\x00)\x81q\x01}q\x02(X\x04\x00\x00\x00nameq\x03X\x06\x00\x00\x00\xe5\xb0\x8f\xe8\x8a\xb1q\x04X\x05\x00\x00\x00colorq\x05X\x03\x00\x00\x00\xe9\xbb\x91q\x06ub.'
) #将bytes转为对象
# pickle.loads 是拿着bytes的存储的对象信息和类的地址再去造一个对象,如果类增加了方法,造的对象也会具有该方法
print(cc)
cc.chi()
cc.he() #
print(cc.name,cc.color)
print("-------写入文件-------------")
pickle.dump(c,open("cat.txt",mode="wb")) #将对象写到文件中
#Write a pickled representation of the given object to the open file.
c2 = pickle.load(open("cat.txt",mode="rb")) #从文件拿到对象
c2.chi()
print(c2.name)
print("------写入多个-------")
c1 = Cat("黑","小黑")
print(c1)
c2 = Cat('白','大白')
c3 = Cat('灰','灰灰')
lst = [c1,c2,c3]
pickle.dump(lst,open("duocat.txt",mode="wb"))
l = pickle.load(open("duocat.txt",mode='rb'))
for dc in l:
dc.chi()
print(dc)
pickle
1 import pickle
2
3 class Cat:
4 def __init__(self,color,name):
5 self.name = name
6 self.color = color
7
8 def he(self):
9 print("喝水")
10
11 def chi(self):
12 print("%s吃小鱼" % self.name)
13 c = Cat('黑','小花')
14 print(c)
15
16 bs = pickle.dumps(c) #将对象转为bytes
17 # print(bs)
18
19 cc = pickle.loads(b'\x80\x03c__main__\nCat\nq\x00)\x81q\x01}q\x02(X\x04\x00\x00\x00nameq\x03X\x06\x00\x00\x00\xe5\xb0\x8f\xe8\x8a\xb1q\x04X\x05\x00\x00\x00colorq\x05X\x03\x00\x00\x00\xe9\xbb\x91q\x06ub.'
20 ) #将bytes转为对象
21 # pickle.loads 是拿着bytes的存储的对象信息和类的地址再去造一个对象,如果类增加了方法,造的对象也会具有该方法
22 print(cc)
23 cc.chi()
24 cc.he() #
25 print(cc.name,cc.color)
26
27
28 print("-------写入文件-------------")
29 pickle.dump(c,open("cat.txt",mode="wb")) #将对象写到文件中
30 #Write a pickled representation of the given object to the open file.
31
32 c2 = pickle.load(open("cat.txt",mode="rb")) #从文件拿到对象
33 c2.chi()
34 print(c2.name)
35
36 print("------写入多个-------")
37 c1 = Cat("黑","小黑")
38 print(c1)
39 c2 = Cat('白','大白')
40 c3 = Cat('灰','灰灰')
41 lst = [c1,c2,c3]
42
43 pickle.dump(lst,open("duocat.txt",mode="wb"))
44
45 l = pickle.load(open("duocat.txt",mode='rb'))
46 for dc in l:
47 dc.chi()
48 print(dc)
二、shelve
shelve提供python的持久化操作。什么叫持久化操作呢? 就是把数据写到硬盘上。在操作shelve的时候非常的像操作一个字典。
d = shelve.open('文件名') #打开文件,会自动生成一个 .dat 文件
d[key] =value #赋值
d[key] #拿值
d[key] = newvalue #修改
d.close() #关闭文件
注意:
修改shelve文件时要加writeback =True ,这是让内存中数据回写到文件。
import shelve
# d = shelve.open("shelve")
# d["小数据库"]= "shelve"
# d.close()
d = shelve.open("shelve")
print(d['小数据库'])
d.close()
#修改
d = shelve.open('shelve')
d['小数据库'] = '字典'
d.close()
c = shelve.open('shelve')
print(c['小数据库'])
c.close()
#存储复杂字典
# di = shelve.open('shelve')
# di['wf'] = {"name":"汪峰",'wife':{'name':'章子怡','hobby':'看电影'}}
# di.close()
#
# dp = shelve.open('shelve')
# print(dp['wf'])
# dp.close()
#修改复杂字典
di = shelve.open('shelve',writeback=True) #
di['wf']['wife']['hobby'] ="听音乐"
di.close()
dp = shelve.open('shelve')
print(dp['wf'])
dp.close()
shelve
1 import shelve
2
3 # d = shelve.open("shelve")
4 # d["小数据库"]= "shelve"
5 # d.close()
6
7 d = shelve.open("shelve")
8 print(d['小数据库'])
9 d.close()
10
11 #修改
12 d = shelve.open('shelve')
13 d['小数据库'] = '字典'
14 d.close()
15
16 c = shelve.open('shelve')
17 print(c['小数据库'])
18 c.close()
19
20 #存储复杂字典
21 # di = shelve.open('shelve')
22 # di['wf'] = {"name":"汪峰",'wife':{'name':'章子怡','hobby':'看电影'}}
23 # di.close()
24 #
25 # dp = shelve.open('shelve')
26 # print(dp['wf'])
27 # dp.close()
28
29 #修改复杂字典
30
31 di = shelve.open('shelve',writeback=True) #
32 di['wf']['wife']['hobby'] ="听音乐"
33 di.close()
34
35 dp = shelve.open('shelve')
36 print(dp['wf'])
37 dp.close()
三、json
json是我们前后端交互的枢纽,相当于编程界的普通话。json全称javascript object notation. 翻译过来叫js对象简谱。
#用json实现前后端交互:
我们的程序是 在python中写的,但是前端那边是用JS来解析json的。所以,我们需要把我们程序产生的字典转化成json格式的json串(字符串),然后网络传输,前端接收到之后,怎么处理是它的事情。
常用操作:
json.dumps(dic,ensure_ascii=False) 把字典转换成json字符串 参数ensure_ascii=False可以让json处理中文字符
json.loads() 把json字符串转化成字典
json.dump() 把字典转换成json字符串. 写入到文件
json.load() 把文件中的json字符串读取. 转化成字典
import json
# 把字典转化成json字符串
dic = {"a": "女王", "b": "萝莉", "c": "小清新"}
s = json.dumps(dic)
print(s) # {"a": "\u5973\u738b", "b": "\u841d\u8389", "c":
"\u5c0f\u6e05\u65b0"}
# 把字典转化成json字符串
s = json.dumps(dic, ensure_ascii=False) #加一个参数处理成中文
print(s) # {"a": "女王", "b": "萝莉", "c": "小清新"}
#把json字符串转成字典
s = '{"a": "女王", "b": "萝莉", "c": "小清新"}'
dic = json.loads(s)
print(type(dic), dic)
#把对象打散成json写入到文件中
dic = {"a": "女王", "b": "萝莉", "c": "小清新"}
f = open("test.json", mode="w", encoding="utf-8")
json.dump(dic, f, ensure_ascii=False)
f.close()
#从文件中读取一个json
f = open("test.json", mode="r", encoding="utf-8")
dic = json.load(f)
f.close()
print(dic)
json
1 import json
2
3 # 把字典转化成json字符串
4 dic = {"a": "女王", "b": "萝莉", "c": "小清新"}
5 s = json.dumps(dic)
6 print(s) # {"a": "\u5973\u738b", "b": "\u841d\u8389", "c":
7 "\u5c0f\u6e05\u65b0"}
8
9 # 把字典转化成json字符串
10 s = json.dumps(dic, ensure_ascii=False) #加一个参数处理成中文
11 print(s) # {"a": "女王", "b": "萝莉", "c": "小清新"}
12
13 #把json字符串转成字典
14 s = '{"a": "女王", "b": "萝莉", "c": "小清新"}'
15 dic = json.loads(s)
16 print(type(dic), dic)
17
18 #把对象打散成json写入到文件中
19 dic = {"a": "女王", "b": "萝莉", "c": "小清新"}
20 f = open("test.json", mode="w", encoding="utf-8")
21 json.dump(dic, f, ensure_ascii=False)
22 f.close()
23
24 #从文件中读取一个json
25 f = open("test.json", mode="r", encoding="utf-8")
26 dic = json.load(f)
27 f.close()
28 print(dic)
# # 我们可以向文件中写入多个json串,但是读取就不行了,因为写的话多个字典写到了一行,但读的时候一行里有多个字典就不好区分,所以无法正常读取。
如何解决呢?
两套方案. 方案一. 把所有的内容准备好统一 进行写入和读取. 但这样处理, 如果数据量小还好. 数据量大的话, 就不够友好了. 方案二. 不用 dump. 改用dumps和loads. 对每一行分别进行写入和读取处理.
import json
lst = [{"a": 1}, {"b": 2}, {"c": 3}]
# 分行写入
f = open("test.json", mode="w", encoding="utf-8")
for el in lst:
s = json.dumps(el, ensure_ascii=True) + "\n"
f.write(s)
f.close()
# 读取
f = open("test.json", mode="r", encoding="utf-8")
for line in f:
dic = json.loads(line.strip())
print(dic)
f.close()
处理多个字典
1 import json
2 lst = [{"a": 1}, {"b": 2}, {"c": 3}]
3 # 分行写入
4 f = open("test.json", mode="w", encoding="utf-8")
5 for el in lst:
6 s = json.dumps(el, ensure_ascii=True) + "\n"
7 f.write(s)
8 f.close()
9 # 读取
10 f = open("test.json", mode="r", encoding="utf-8")
11 for line in f:
12 dic = json.loads(line.strip())
13 print(dic)
14 f.close()
四、configparser模块
该模块用于配置文件,比如配置windows的 ini格式的文件。
可以包含一个或多个节(section),每个节可以有多个参数(键=值).
整个文件相当于一个大字典,每节相当于一个小字典,可以像字典一样进行操作。
#配置文件样式
#用python初始化一个配置文件
初始化一个配置文件 .ini后缀
config = configparser.ConfigParser() #创建对象
config['DEFAULT'] = {
"sleep": 1000,
"session-time-out": 30,
"user-alive": 999999
}
config['TEST-DB'] = {
"db_ip": "192.168.17.189",
"port": "3306",
"u_name": "root",
"u_pwd": "123456"
}
config['168-DB'] = {
"db_ip": "152.163.18.168",
"port": "3306",
"u_name": "root",
"u_pwd": "123456"
}
config['173-DB'] = {
"db_ip": "152.163.18.173",
"port": "3306",
"u_name": "root",
"u_pwd": "123456"
}
f = open("db.ini", mode="w")
config.write(f) # 写入文件
f.flush()
f.close()
初始化配置文件
1 初始化一个配置文件 .ini后缀
2 config = configparser.ConfigParser() #创建对象
3 config['DEFAULT'] = {
4 "sleep": 1000,
5 "session-time-out": 30,
6 "user-alive": 999999
7 }
8 config['TEST-DB'] = {
9 "db_ip": "192.168.17.189",
10 "port": "3306",
11 "u_name": "root",
12 "u_pwd": "123456"
13 }
14 config['168-DB'] = {
15 "db_ip": "152.163.18.168",
16 "port": "3306",
17 "u_name": "root",
18 "u_pwd": "123456"
19 }
20 config['173-DB'] = {
21 "db_ip": "152.163.18.173",
22 "port": "3306",
23 "u_name": "root",
24 "u_pwd": "123456"
25 }
26 f = open("db.ini", mode="w")
27 config.write(f) # 写入文件
28 f.flush()
29 f.close()
#读取文件信息
config = configparser.ConfigParser()
config.read("db.ini") # 读取文件
print(config.sections()) # 获取到section. 章节...DEFAULT是给每个章节都配备的信息
print(config.get("DEFAULT", "SESSION-TIME-OUT")) # 从xxx章节中读取到xxx信息
# 也可以像字典一样操作
print(config["TEST-DB"]['DB_IP'])
print(config["173-DB"]["db_ip"]) #可以不区分大小写
for k in config['168-DB']:
print(k)
for k, v in config["168-DB"].items():
print(k, v)
print(config.options('168-DB')) # 同for循环,找到'168-DB'下所有键
print(config.items('168-DB')) #找到'168-DB'下所有键值对
print(config.get('168-DB','db_ip')) # 152.163.18.168 get方法Section下的key对应的value
读
1 config = configparser.ConfigParser()
2 config.read("db.ini") # 读取文件
3 print(config.sections()) # 获取到section. 章节...DEFAULT是给每个章节都配备的信息
4 print(config.get("DEFAULT", "SESSION-TIME-OUT")) # 从xxx章节中读取到xxx信息
5 # 也可以像字典一样操作
6 print(config["TEST-DB"]['DB_IP'])
7 print(config["173-DB"]["db_ip"]) #可以不区分大小写
8 for k in config['168-DB']:
9 print(k)
10 for k, v in config["168-DB"].items():
11 print(k, v)
12 print(config.options('168-DB')) # 同for循环,找到'168-DB'下所有键
13 print(config.items('168-DB')) #找到'168-DB'下所有键值对
14 print(config.get('168-DB','db_ip')) # 152.163.18.168 get方法Section下的key对应的value
#增删改操作
# 先读取. 然后修改. 最后写回文件
config = configparser.ConfigParser()
config.read("db.ini") # 读取文件
# 添加一个章节
# config.add_section("189-DB")
# config["189-DB"] = {
# "db_ip": "167.76.22.189",
# "port": "3306",
# "u_name": "root",
# "u_pwd": "123456"
# }
# 修改信息
config.set("168-DB", "db_ip", "10.10.10.168")
# 删除章节
config.remove_section("173-DB")
# 删除元素信息
config.remove_option("168-DB", "u_name")
# 写回文件
config.write(open("db.ini", mode="w"))
增删改
1 # 先读取. 然后修改. 最后写回文件
2 config = configparser.ConfigParser()
3 config.read("db.ini") # 读取文件
4 # 添加一个章节
5 # config.add_section("189-DB")
6 # config["189-DB"] = {
7 # "db_ip": "167.76.22.189",
8 # "port": "3306",
9 # "u_name": "root",
10 # "u_pwd": "123456"
11 # }
12 # 修改信息
13 config.set("168-DB", "db_ip", "10.10.10.168")
14 # 删除章节
15 config.remove_section("173-DB")
16 # 删除元素信息
17 config.remove_option("168-DB", "u_name")
18 # 写回文件
19 config.write(open("db.ini", mode="w"))
python学习15-序列化(转载)的更多相关文章
- 廖雪峰Python学习笔记——序列化
序列化 定义:程序运行时所有变量都存在内存中,把变量从内存中变成可存储或可传输的过程称为序列化pickling,在其他语言中称为serialization,marshalling,flattening ...
- 《Python 二三事》——python学习必看(转载)
面向初学者介绍Python相关的一些工具,以及可能遇到的常见问题. 原文出处 原文作者:八八年出生的男性,互联网上常用id是 jagttt .目前正从事 IT 行业的工作.业余爱好是动漫游加电 ...
- Python学习--15 日期和时间
获取当前时间 # coding: utf-8 from datetime import datetime now = datetime.now() print(now) print(now.strft ...
- Python学习--14 序列化
把变量从内存中变成可存储或传输的过程称之为序列化,在Python中叫pickling,在其他语言中也被称之为serialization,marshalling,flattening等等. pickle ...
- 《转》Python学习(15)-对文件的操作(二)
转自 http://www.cnblogs.com/BeginMan/p/3169020.html 一.文件系统 从系统角度来看,文件系统是对文件存储器空间进行组织和分配,负责文件存储并对存入的文件进 ...
- python学习笔记 序列化
在程序运行的过程中,所有的变量都是在内存中,比如,定义一个dict: d = dict(name='Bob', age=20, score=88) 可以随时修改变量,比如把name改成'Bill',但 ...
- python学习2(转载)
一.流程控制之while循环 语法:while 条件: 循环体else: else语句(当条件不成立的时候执行这里 和break没关系) 判断条件是否成立. 如果成立执行循环体.然后再次判断条件,.. ...
- python学习之序列化
序列化:不同编程语言之间传递对象需要序列化成标准格式,有XML /JSON,json格式化为字符串,UTF-8编码,速度快,切实标准格式.JSON 和 Python内置的数据类型对应如下: JSON ...
- Python学习笔记——Day5(转载)
python 编码转换 主要介绍了python的编码机制,unicode, utf-8, utf-16, GBK, GB2312,ISO-8859-1 等编码之间的转换. 常见的编码转换分为以下几种情 ...
- Python学习-15.Python的中的套接字socket
Python应用最广泛的要数web方面了.因此,socket显得十分重要. 要使用socket,必须引入socket模块,因此在Python脚本开头先写入 import socket 学过socket ...
随机推荐
- lnmp 多站点配置负载均衡
1.虚拟机安装3个centos 2.三台服务器IP: 192.168.191.129(主)192.168.191.130192.168.191.131 3.分别在3台服务器的vhost目录下新建配置文 ...
- css 字体上下居中显示 解决安卓手机line-height的偏差
1.字体左右居中显示 text-align: center <div class="font"> 上下居中 </div> .font{ width: ...
- activiti监听器
activiti使用的时候,通常需要跟业务紧密的结合在一起,有些业务非常的复杂,通常有如下一些场景: 1.activiti人员动态的分配. 2.当前任务节点完成的时候,指定需要指定下一个节点的处理人( ...
- lspci通过系统总线查看硬件设备信息
lspci - 列出所有PCI设备 PCI 的科普: PCI(Peripheral Component Interconnect),是一种连接电子计算机主板和外部设备的总线标准. 常见的PCI卡包括网 ...
- 安装Python-Windows
安装Python-Windows 在开始Python编程前,需要先安装Python环境.Python安装包可以到Python的官网下载,官网地址是https://www.python.org/,如果想 ...
- Linux RPM学习笔记
RPM(RedHat Package Manager) rp-pppoe-3.1-5.i386.rpm软件名称-版本号-编译次数-适合的硬件平台.扩展名 xxx-devel.rpm开发使用 xxx.n ...
- Transaction And Lock--锁相关基础
--=======================================================--锁提示--holdlock :将共享锁保留到事务完成,而不是在相应的表.行或数据页 ...
- 数独·唯一性技巧(Uniqueness)-2
Hidden Rectangle(隐藏矩形) 在由候选数(AB)组成.可能形成UR结构的4格中,有2-3格存在额外的候选数,此时若以不存在额外候选数的一格为起点,检查其对角格所在的行和列,若该行和列其 ...
- .Net Core 自动化部署:使用jenkins部署到linux docker容器运行
上次我们说到.Net Core 自动化部署:使用docker版jenkins部署dotnetcore应用,这次我们使用jenkins发布我们的.NET Core站点到docker容器中运行,为后面的的 ...
- 通过api获取句柄控制其他窗体
很多时候,编写程序模拟鼠标和键盘操作可以方便的实现你需要的功能,而不需要对方程序为你开放接口.比如,操作飞信定时发送短信等.我之前开发过飞信耗子,用的是对飞信协议进行抓包,然后分析协议,进而模拟协议的 ...