python记录_day22 序列化
序列化是指把内存里的数据类型转换成字符串,以使其能存储到硬盘或通过网络传输到远程,因为硬盘和网络传输时只能接受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
二、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
三、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
# # 我们可以向文件中写入多个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()
处理多个字典
四、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": "",
- "u_name": "root",
- "u_pwd": ""
- }
- config['168-DB'] = {
- "db_ip": "152.163.18.168",
- "port": "",
- "u_name": "root",
- "u_pwd": ""
- }
- config['173-DB'] = {
- "db_ip": "152.163.18.173",
- "port": "",
- "u_name": "root",
- "u_pwd": ""
- }
- f = open("db.ini", mode="w")
- config.write(f) # 写入文件
- f.flush()
- 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
读
#增删改操作
- # 先读取. 然后修改. 最后写回文件
- 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"))
增删改
python记录_day22 序列化的更多相关文章
- python基础之 序列化,os,sys,random,hashlib
1.序列化 定义: JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.简单地说,JSON 可以将 JavaScript 对象中表示的一组数据转换为字符串,然 ...
- 【转】Python之数据序列化(json、pickle、shelve)
[转]Python之数据序列化(json.pickle.shelve) 本节内容 前言 json模块 pickle模块 shelve模块 总结 一.前言 1. 现实需求 每种编程语言都有各自的数据类型 ...
- 廖雪峰Python学习笔记——序列化
序列化 定义:程序运行时所有变量都存在内存中,把变量从内存中变成可存储或可传输的过程称为序列化pickling,在其他语言中称为serialization,marshalling,flattening ...
- python 3 json 序列化
python 3 json 序列化 我们学习过用eval内置方法可以将一个字符串转成python对象,不过,eval方法是有局限性的,对于普通的数据类型,json.loads和eval都能用,但遇到特 ...
- Python之路--序列化
序列化的目的 1.以某种存储形式使自定义对象持久化 2.将对象从一个地方传递到另一个地方 3.使程序更具有维护性 json json多语言通用 四个功能:dumps.dump.loads.load # ...
- Python中的序列化以及pickle和json模块介绍
Python中的序列化指的是在程序运行期间,变量都是在内存中保存着的,如果我们想保留一些运行中的变量值,就可以使用序列化操作把变量内容从内存保存到磁盘中,在Python中这个操作叫pickling,等 ...
- python接口测试之序列化与反序列化(四)
在python中,序列化可以理解为:把python的对象编码转换为json格式的字符串,反序列化可以理解为:把json格式 字符串解码为python数据对象.在python的标准库中,专门提供了jso ...
- 一文了解Python常见的序列化操作
关于我 一个有思想的程序猿,终身学习实践者,目前在一个创业团队任team lead,技术栈涉及Android.Python.Java和Go,这个也是我们团队的主要技术栈. Github:https:/ ...
- python操作文件——序列化pickling和JSON
当我们在内存中定义一个dict的时候,我们是可以随时修改变量的内容的: >>> d=dict(name='wc',age=28) >>> d {'name': 'w ...
随机推荐
- 推荐一个静态博客兼笔记的工具:WDTP
简介 WDTP(山湖录)不止是一款开源免费的GUI桌面单机版静态网站生成器和简单方便的前端开发工具,更是一款跨平台的集笔记.录音.个人知识管理.写作/创作.博客/网站内容与样式管理等功能于一体的多合一 ...
- 卸载linux系统上自带的mysql
步骤: 1.打开centos命令提示符,切换为root用户 2.输入rpm -qa|grep -i mysql命令以检查系统含有的mysql插件,回车,若没有则说明无自带mysql,系统很干净.若有显 ...
- Oracle 之 函数运用
NVL函数:NVL(a,b)就是判断a是否是NULL,如果不是返回a的值,如果是返回b的值 通过查询获得某个字段的合计值,如果这个值位null将给出一个预设的默认值 通过nvl 对定义值赋值的语法: ...
- netty基础
1,ServerBootstrap [Bootstrap]
- (zhuan) 一些RL的文献(及笔记)
一些RL的文献(及笔记) copy from: https://zhuanlan.zhihu.com/p/25770890 Introductions Introduction to reinfor ...
- VHDL 例程
以下程序未经仿真,仅供说明 语法 声明参考库ieee,使用ieee中的std_logic_1164包全部条目可见 library ieee; use ieee.std_logic_1164.all; ...
- VHDL 乐曲演奏电路设计
前言 无源蜂鸣器在直流信号下不会响,需要方波驱动.输入不同频率的方波会发出不同音调的声音,方波的幅值决定了声音的响度. 目标 乐曲发生电路在节拍(4Hz)的控制下根据乐谱产生合适的分频系数.分频器根据 ...
- React组件导入的两种方式(动态导入组件的实现)
一. react组件两种导入方式 React组件可以通过两种方式导入另一个组件 import(常用) import component from './component' require const ...
- _event_phase
EventId 事件ID Phase 阶段ID,从1开始 StopGUID 击杀生物或摧毁物体当前阶段结束,,正数为生物,负数为物体
- python3 items() 与 python2 中iteritems()的区别
在Python2.x中, iteritems() 用于返回本身字典列表操作后的迭代 Python 3.x 里面, iteritems() 方法已经废除了,而 items() 得到的结果是和 2.x 里 ...