一.序列化

指:在我们存储数据的时候,需要对我们的对象进行处理,把对象处理成方便存储和传输的数据格式,这个就是序列化,

不同的序列化结果不同,但目的是一样的,都是为了存储和传输.

一,pickle.可以将我们python中的任意数据类型转化成bytes并写入到文件中.

同样也可以把文件中写好的bytes转换回我们的python的数据.这个过程被称为序列化

import pickle
class Cat:
def __init__(self, name, age):
self.name = name
self.age = age
def catchMouse(self):
print(self.name, "抓⽼⿏")
c = Cat("jerry", 18)
bs = pickle.dumps(c) # 序列化一个对象.
print(bs) # 一堆二进制. 看不懂
cc = pickle.loads(bs) # 把二进制反序列化成我们的对象
cc.catchMouse() # 猫依然是猫. 还可以抓老鼠
pickle中的dumps可以序列化一个对象. loads可以反序列化一个对象. 我们使用dump
还可以直接 把一个对象写入到文件中
# f = open("cat", mode="wb")
# pickle.dump(c, f) # 写到⽂件中
# f.close()
f = open("cat", mode="rb")
cc = pickle.load(f) # 从文件中读取对象
cc.catchMouse()

 pickle还⽀持多个对象的写出.

lst = [Cat("jerry", 19), Cat("tommy", 20), Cat("alpha", 21)]
f = open("cat", mode="wb")
for el in lst:
pickle.dump(el, f) # 写⼊到⽂件中
f.close()
f = open("cat", mode="rb")
for i in range(len(lst)):
cc = pickle.load(f) # 从⽂件中读取对象
cc.catchMouse()
lst = [c1, c2, c3]
f = open("cat.dat", mode="ab")
pickle.dump(lst, f) # 把对象写到文件中 f = open("cat.dat", mode="rb")
lst = pickle.load(f) # 读取第一次
for cc in lst:
cc.chi()
用户注册与登录
class User:
def __init__(self, username, password):
self.username = username
self.password = password class client:
def regist(self):
uname = input("please input your username:")
pwd = input("please input your password:")
user = User(uname, pwd)
pickle.dump(user, open("userinfo", mode="ab"))
print("regist successful!!!") def login(self):
uname = input("please input your username:")
pwd = input("please input your password:")
f = open("userinfo", mode="rb")
while 1:
try:
u = pickle.load(f) # 从文件里把对象拿出来
if u.username == uname and u.password == pwd:
print("login successful !!")
break except Exception as e:
print("login failed !!!")
break c = client()
# c.regist()
# c.regist()
# c.regist()
# c.regist()
c.login()

 三.shelve

shelve. 简单另类的一种序列化的方案. 有点⼉类似redis. 可以作为 一种小型的数据库来使用

shelve提供python的持久化操作就是把数据写到硬盘上. 在操作shelve的时候非常的像操作一个字典

import shelve
shelf = shelve.open("sylar")
# shelf["jay"] = "周杰伦"
print(shelf['jay'])
shelf.close()

 我们存储 ⼀些复杂的数据 

我们存储一些复杂的数据
s = shelve.open("sylar")
# s["jay"] = {"name":"周杰伦", "age":18, "hobby":"哄⼩孩"}
print(s['jay'])
s.close()
修改时注意需添加参数writeback=True
s = shelve.open("sylar", writeback=True)
s['jay']['name'] = "胡辣汤" # 尝试改变字典中的数据
s.close()
s = shelve.open("sylar")
print(s['jay']) # 改变了.
s.close() writeback=True可以动态的把我们修改的信息写入到文件中还可以删
除数据. 就像字典⼀样.
s = shelve.open("sylar", writeback=True)
del s['jay']
s.close() s = shelve.open("sylar")
print(s['jay']) # 报错了, 没有了
s.close() s = shelve.open("sylar", writeback=True)
s['jay'] = "周杰伦"
s['wlj'] = "王力宏"
s.close() s = shelve.open("sylar")
for k in s: # 像字典一样遍历
print(k)
print(s.keys()) # 拿到所有key的集合
for k in s.keys():
print(k)
for k, v in s.items(): # 像字典一样操作
print(k, v)
s.close()

 四. json(重点) 

概念  json. 将python中常用的字典, 列表转化成字符串. 是目前前后端数据交互使用频率 最高的一种数据格式.

json是我们前后端交互的枢纽. 相当于编程界的普通话. 大家沟通都用 json.因为json的语法格式可以完美的表示出一个对象.

json全 称javascript object notation. 翻译过来叫js对象

wf = {
"name":"汪峰",
"age":18,
"hobby":"上头条",
"wife":{
"name":'⼦怡',
"age":19,
"hobby":["唱歌", "跳舞", "演戏"]
}

  用xml写

<?xml version="1.0" encoding="utf-8" ?>
<wf>
<name>汪峰</name>
<age>18</age>
<hobby>上头条</hobby>
<wife>
<name>子怡</name>
<age>18</age>
<hobbies>
<hobby>唱歌</hobby>
<hobby>跳舞</hobby>
<hobby>演戏</hobby>
</hobbies>
</wife> </wf>

  json案例

import  json
例一
# 准备一个字典
dic = {"a": "小萝莉", "b": "大萝莉", "c": "猥琐大叔", "d": False, "e": None}
# python中可以直接把字典或者列表转化成json
s = json.dumps(dic, ensure_ascii=False) # pickle
print(type(s))
print(s)
例二
s = '{"a": "小萝莉", "b": "大萝莉", "c": "猥琐大叔", "d": false, "e": null}'
d = json.loads(s) # 把json转化成字典
print(d)
print(type(d)) 例三
dic = {"a": "小萝莉", "b": "大萝莉", "c": "猥琐大叔", "d": False, "e": None, "wf":{"name":"半壁江山", "hobby":"皮裤"}}
f = open("sylar.json", mode="w", encoding="utf-8")
json.dump(dic, f, ensure_ascii=False, indent=4) # 4个空格 = 1个tab f = open("sylar.json", mode="r", encoding="utf-8")
d = json.load(f)
print(d)
例四
class Person:
def __init__(self, firstName, lastName):
self.firstName = firstName
self.lastName = lastName s = '{"firstName": "尼古拉斯", "lastName": "刘能"}'
def func(dic):
return Person(dic['firstName'], dic["lastName"])
p = json.loads(s, object_hook=func) # 通过函数func把字典转换回对象
print(p.firstName, p.lastName)
p = Person("尼古拉斯", "刘能")
例五
#把对象转换成json
s = json.dumps(p.__dict__, ensure_ascii=False) # 方案一, 转的是字典
def func(obj):
return {
"firstName": obj.firstName,
"lastName": obj.lastName
}
s = json.dumps(p, default=func, ensure_ascii=False) # 方案二 转化的也是字典
print(s)
例六
dic1 = {"name":'毒液', "评分": "0.9"}
dic2 = {"name":'与神同行', "评分": "10"}
dic3 = {"name":'看不见的客人', "评分": "9.5"}
lst = [dic1, dic2, dic3]
f = open("movie.json", mode="w", encoding="utf-8")
for d in lst:
s = json.dumps(d, ensure_ascii=False)
f.write(s+"\n") f = open("movie.json", mode="r", encoding="utf-8")
dic1 = json.load(f) # 当json文件中保存多个json的时候不能一次性全部都读取出来
print(dic1) f = open("movie.json", mode="r", encoding="utf-8")
for line in f:
line = line.strip()
if line == "":
continue
else:
d = json.loads(line) # 一行一行的处理
print(d)

 五 configparser模块

该模块适⽤于配置⽂件的格式与windows ini文件类似,可以包含一个或多个节(section)每个节 可以有多个参数(键=值). 首先, 我们先看一个xxx服务器的配置文件

import configparser
config = configparser.ConfigParser() # 创建对象 config['DEFAULT'] = { # 特殊
"name":"腾讯qq木马",
"time":"qq更新时间",
"version":"1.0"
}
config['SERVER_1'] = {
"IP":"192.168.1.123",
"port":"12306"
}
config['SERVER_2'] = {
"IP":"192.168.1.178",
"port":"12311"
}
config['SERVER_3'] = {
"IP":"192.168.1.176",
"port":"12312"
} # 写入到文件
config.write(open("qq.ini", mode="w", encoding="utf-8")) # 读取内容
config = configparser.ConfigParser()
# 读取内容
config.read("qq.ini", encoding="utf-8") # 此时我们把文件中的内容读取到config
print(config['SERVER_1']['IP']) # 字典
print(config['SERVER_2']['name'])
print(config.get("SERVER_3", "IP")) # 字典 for k, v in config['DEFAULT'].items():
print(k, v) # config = configparser.ConfigParser()
# # 读取内容
# config.read("qq.ini", encoding="utf-8") # 此时我们把文件中的内容读取到config
# config['SERVER_1']['NAME'] = "哈哈哈"
# config.write(open("qq.ini", mode="w", encoding="utf-8"))

 

# 先读取. 然后修改. 最后写回文件
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中常用的模块二的更多相关文章

  1. python中常用的模块的总结

    1. 模块和包 a.定义: 模块用来从逻辑上组织python代码(变量,函数,类,逻辑:实现一个功能),本质就是.py结尾的python文件.(例如:文件名:test.py,对应的模块名:test) ...

  2. python中常用的模块一

    一,常用的模块 模块就是我们将装有特定功能的代码进行归类,从代码编写的单位来看我们的程序,从小到大的顺序: 一条代码<语句块,<代码块(函数,类)<模块我们所写的所有py文件都是模块 ...

  3. Python中常用的模块

    模块,用一砣代码实现了某个功能的代码集合. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合.而对于一个复杂的功能来,可能需要多个函数才 ...

  4. 常用正则表达式与python中的re模块

    正则表达式是一种通用的字符串匹配技术,不会因为编程语言不一样而发生变化. 部分常用正则表达式规则介绍: . 匹配任意的一个字符串,除了\n * 匹配任意字符串0次或者任意次 \w 匹配字母.数字.下划 ...

  5. 【转】python 历险记(四)— python 中常用的 json 操作

    [转]python 历险记(四)— python 中常用的 json 操作 目录 引言 基础知识 什么是 JSON? JSON 的语法 JSON 对象有哪些特点? JSON 数组有哪些特点? 什么是编 ...

  6. python中常用的九种数据预处理方法分享

    Spyder   Ctrl + 4/5: 块注释/块反注释 本文总结的是我们大家在python中常见的数据预处理方法,以下通过sklearn的preprocessing模块来介绍; 1. 标准化(St ...

  7. Python中的单元测试模块Unittest快速入门

    前言 为什么需要单元测试? 如果没有单元测试,我们会遇到这种情况:已有的健康运行的代码在经过改动之后,我们无法得知改动之后是否引入了Bug.如果有单元测试的话,只要单元测试全部通过,我们就可以保证没有 ...

  8. python中常用的九种预处理方法

    本文总结的是我们大家在python中常见的数据预处理方法,以下通过sklearn的preprocessing模块来介绍; 1. 标准化(Standardization or Mean Removal ...

  9. python中常用的导包的方法和常用的库

    python中常用的导包的方法               导入包和包名的方法:1.import package.module 2.from package.module import  * 例一: ...

随机推荐

  1. Spring P命名空间 02

    P命名空间 装配属性 使用<property> 元素为Bean 的属性装配值和引用并不太复杂.尽管如此,Spring 的命名空间p 提供了另一种Bean 属性的装配方式,该方式不需要配置如 ...

  2. OpenGL读取帧缓存数据

    https://blog.csdn.net/niu2212035673/article/details/80251949 简述有些时候我们可能需要获取渲染后的图像数据,比较常用的函数是glReadPi ...

  3. kivy 笔记

    没有引入App对象,就不会得到一个窗口. kvlanguage用来构建UI界面,这个文件保存成”.kv”. kivy用widget来描述UI元素,lable.layout等都是widget 简单一点的 ...

  4. 合并ts到mp4

    这个比较好用. copy /b d:\xxx\download_ts\*   d:\xxx\download_ts\new.mp4 用python ffmpeg也可以,不过我合出来有卡顿或者掉声问题, ...

  5. 使用sqlalchemy用orm方式写pipeline将scrapy item快速存入 MySQL

    传统的使用scrapy爬下来的数据存入mysql,用的是在pipeline里用pymysql存入数据库, 这种方法需要写sql语句,如果item字段数量非常多的 情况下,编写起来会造成很大的麻烦. 我 ...

  6. python简说(十四)内置函数

    # sorted 排序# map  循环调用函数的,保存返回值# filter  循环调用函数,如果函数返回false,那么就过滤掉这个值,是指从你传入的这个list里面过虑. def abc(num ...

  7. 寻找复杂背景下物体的轮廓(OpenCV / C++ - Filling holes)

    一.问题提出 这是一个来自"answerOpenCV"(http://answers.opencv.org/question/200422/opencv-c-filling-hol ...

  8. java常用类-StringBuffer,Integer,Character

    * StringBuffer: * 线程安全的可变字符串. * * StringBuffer和String的区别? * 前者长度和内容可变,后者不可变. * 如果使用前者做字符串的拼接,不会浪费太多的 ...

  9. Linux lvm 分区知识笔记

    盘面上可以细分出扇区(Sector)与柱面(Cylinder)两种单位,其中扇区每个为512bytes那么大. 通常所说的"硬盘分区"就是指修改磁盘分区表,它定义了"第n ...

  10. Cmder + Babun 打造 Windows 好用的终端工具

    Babun a windows shell you will love Babun features the following: Pre-configured Cygwin with a lot o ...