序列化模块补充:
1.json格式的限制,json格式的key必须是字符串数据类型
2.json格式的字符串必须是""
如果数字是key,那么dump之后会强转成字符串数据类型
import json
dic = {1:2,3:4}
str_dic = json.dumps(dic)
print(str_dic)#{"1": 2, "3": 4}
new_dic = json.loads(str_dic)
print(new_dic)#{'1': 2, '3': 4}
json是否支持元组,对元组做value的字典会把元组强制转换为列表.
import json
dic = {"abc":(1,2,3)}
str_dic = json.dumps(dic)
print(str_dic)#{"abc": [1, 2, 3]}
new_dic = json.loads(str_dic)
print(new_dic)#{'abc': [1, 2, 3]}
json是否支持元组做key?不可以.
import json
dic = {(1,2,3):"abc"}
str_dic = json.dumps(dic)
print(str_dic)#TypeError: keys must be a string
new_dic = json.loads(str_dic)
print(new_dic)
对列表的dump.
import json
lst = [1,2,"abc",12.3]
with open("json_demo",'w')as f:
json.dump(lst,f)
with open('json_demo')as f:
ret = json.load(f)
print(ret)#[1, 2, 'abc', 12.3]
能不能多次dump数据到文件里,可以多次dump但不能load出来.
import json
dic = {'abc':(1,2,3)}
lst = [1,2,3,"abc",12.3]
with open('json_demo','w')as f:
json.dump(dic,f)
json.dump(lst,f) #{"abc": [1, 2, 3]}[1, 2, 3, "abc", 12.3]
with open("json_demo")as f:
ret = json.load(f)
print(ret)
想dump多个数据到文件里用dumps
import json
dic = {'abc':(1,2,3)}
lst = [1,2,3,"abc",12.3]
with open("json_demo",'w')as f:
str_dic = json.dumps(dic)
str_lst = json.dumps(lst)
f.write(str_dic+"\n")
f.write(str_lst+'\n')
with open('json_demo')as f:
for line in f:
ret = json.loads(line)
print(ret)
#{'abc': [1, 2, 3]}
#[1, 2, 3, 'abc', 12.3]
中文格式 (ensure_ascii = False)
import json
dic = {"abc":(1,2,3,),"country":"中国"}
ret = json.dumps(dic,ensure_ascii=False)
print(ret)#{"abc": [1, 2, 3], "country": "中国"}
dic_new = json.loads(ret)
print(dic_new)#{'abc': [1, 2, 3], 'country': '中国'} with open("json_demo","w")as f:
json.dump(dic,f)
with open("json_demo")as f:
ret = json.load(f)
print(ret)#{'abc': [1, 2, 3], 'country': '中国'}
json的其他参数,是为了用户看的更方便,但是会相对浪费空间.
import json
data = {"username":["李华","李二楞"],"sex":"male",'age':21}
json_dic = json.dumps(data,sort_keys=True,indent=4,separators=(',',':'),ensure_ascii=False)
print(json_dic)
# {
# "age":21,
# "sex":"male",
# "username":[
# "李华",
# "李二楞"
# ]
# }
注:set不能被dump/dumps
序列化模块之pickle
dump的结果是bytes,dump用的f文件句柄需要以wb的形式打开,load所用的模式是rb模式
支持几乎所有对象的序列化
对于对对象的序列化需要这个对象的类在内存中
对于多次的dump和load的操作做了良好的处理
import pickle
dic = {1:(1,2,3),("abc","def"):1.23}
pic_dic = pickle.dumps(dic)
print(pic_dic)#bytes类型
new_dic = pickle.loads(pic_dic)
print(new_dic)#{1: (1, 2, 3), ('abc', 'def'): 1.23}
pickle几乎支持所有对象的序列化.
import pickle
class Student:
def __init__(self,name,age):
self.name = name
self.age = age alex = Student("alex",83)
ret = pickle.dumps(alex)
print(ret)#bytes类型
new_ret = pickle.loads(ret)
print(new_ret.name)#alex
print(new_ret.age)# with open("pickle_demo",'wb')as f:
pickle.dump(alex,f)
with open("pickle_demo",'rb')as f:
a = pickle._load(f)
print(a.name)#alex
print(a.age)#
序列化模块之shelve:
import shelve
f = shelve.open("shelve_demo")
f['key'] = {'k1':123,'k2':'k3'}
f.close()
f = shelve.open("shelve_demo")
ret = f['key']
f.close()
print(ret)#{'k1': 123, 'k2': 'k3'}
shelve如果你写定了一个文件,改动的比较少,读文件的操作比较多,且你大部分的读取都需要基于某个key获得某个value
hashilib模块(摘要算法的模块):
能够把一个字符串的数据类型的变量转换成一个定长的,密文的字符串,字符串里的每一个字符都是一个十二进制的数字 对于同一个字符串,不管这个字符串有多长,只要是相同的,无论在任何环境下,多少次执行,在任何语言中,
使用相同的算法/相同的手段得到的结果都是相同的.如果不是相同的字符串,得到的结果一定不同
算法:对于相同的字符串,用相同的算法,相同的手段,得到的值一定是相同的
md5是一个算法,32位的字符串,每个字符都是一个十六进制
md5算法:效率快,算法相对简单
import hashlib
s1 = 'alex3714'
s2 = 'alex21348174612571'
md5_obj = hashlib.md5()
md5_obj.update(s1.encode("utf-8"))
res = md5_obj.hexdigest()
print(res,len(res),type(res))
#aee949757a2e698417463d47acac93df 32 <class 'str'>
数据库->撞库
import hashlib
s1 = ''
md5_oobj = hashlib.md5()
md5_oobj.update(s1.encode('utf-8'))
res = md5_oobj.hexdigest()
print(res,len(res),type(res))
# f7fc239ea412bcec46a2c6ca3a58c517 32 <class 'str'>
加盐
import hashlib
s1 = 'corn123'#1c22330a641d90698dbdf1ae3a10a6a6 32 <class 'str'>
md5_obj = hashlib.md5('任意的字符串作为盐'.encode('utf-8'))
md5_obj.update(s1.encode('utf-8'))
res = md5_obj.hexdigest()
print(res,len(res),type(res))
#00ed5d09379b4287cc1654705aeb6cd8 32 <class 'str'>
动态加盐:
用用户名作为加盐,因为用户名不能相同,这样比较安全.
import hashlib
username = input('username>>>')
password = input("password>>>")
md5_obj = hashlib.md5(username.encode("utf-8"))
md5_obj.update(password.encode('utf-8'))
res = md5_obj.hexdigest()
print(res,len(res),type(res))
sha1也是一种算法,40位的字符串,每个字符都是一个十六进制.
算法相对复杂,计算也慢.
import hashlib
s1 = 'corn'
sha1_obj = hashlib.sha1()
sha1_obj.update(s1.encode('utf-8'))
res = sha1_obj.hexdigest()
print(res,len(res),type(res))
#7cacb75c4cc31d62a6c2a0774cf3c41a70f01bc0 40 <class 'str'>
sha1算法加盐.
import hashlib
s1 = 'corn'
sha1_obj = hashlib.sha1(''.encode('utf-8'))
sha1_obj.update(s1.encode('utf-8'))
res = sha1_obj.hexdigest()
print(res,len(res),type(res))
#dbd08e07817591b800c61a43ab5664bbf65a4b69 40 <class 'str'>
sha1算法动态加盐.
import hashlib
username = input("username>>>")
password = input("password>>>")
sha1_obj = hashlib.sha1(username.encode('utf-8'))
sha1_obj.update(password.encode('utf-8'))
res = sha1_obj.hexdigest()
print(res,len(res),type(res))
md5和sha1的区别:
md5:32位字符串,目前 MD5 是一种不可逆算法。具有很高的安全性。它对应任何字符串都可以加密成一段唯一的固定长度的代码。
sha1:40位字符串,sha1基于md5,加密后的数据长度更长,它对长度小于 24的输入,产生长度为160bit的散列值.比md5多32位.因此,比md5更加安全,但sha1的运算速度就比md5要慢了。
文件的一致性校验.
import hashlib
md5_obj = hashlib.md5()
with open('shelve_demo.dir','rb')as f:
md5_obj.update(f.read())
ret = md5_obj.hexdigest()
md5_obj = hashlib.md5()#需要实例化两次
with open("shelve_demo.bak",'rb')as f:
md5_obj.update(f.read())
ret1 = md5_obj.hexdigest()
print(ret,ret1)
#d4d69a04f38df23025caf0ed85f9961c d4d69a04f38df23025caf0ed85f9961c
configparser模块:
有一种固定格式的配置文件,有一个对应的模块去帮你做这个文件的字符串处理
setting.py 配置
import configparser

corn = configparser.ConfigParser()
corn['DEFAULT'] = {'ServerAliveInterval':'',
'Compression':'yes',
'CompressionLevel':'',
'ForwardX11':'yes'
} corn['bitbucket.org'] = {'User':'hg'}
corn['topsecret.serve.com'] = {'Host port':'','ForwardX11':'no'} with open('example.ini','w')as f:
corn.write(f)
logging模块:
 1.日志格式的规范
2.操作的简化
3.日志的分级管理 logging 不能帮你做的事情.
1.自动帮你打印你要打印的内容
2.需要程序员自己在开发过程中定义好
3.在哪些地方需要打印,要打印的内容是什么,内容级别 logging模块的使用:
1.普通配置型 简单的,可定制化差
2.对象配置型 复杂的,可定制化强
认识日志分级
import logging

logging.debug("debug message")  #调试模式
logging.info("info message") #基础信息
logging.warning("warning message")#警告
logging.error("error message") #错误
logging.critical("critical message")#严重错误 import logging
logging.basicConfig(level=logging.DEBUG,
format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
datefmt='%a, %d %b %Y %H:%M:%S',
filename='test.log')
logging.debug('debug message') # 调试模式
logging.info('info message') # 基础信息
logging.warning('warning message') # 警告
logging.error('error message') # 错误
logging.critical('critical message')# 严重错误 basicConfig
# 不能将一个log信息既输出到屏幕 又输出到文件
logger对象的形式来操作日志文件

创建一个logger对象
创建一个文件管理操作符
创建一个屏幕管理操作符
创建一个日志输出的格式 文件管理操作符 绑定一个 格式
屏幕管理操作符 绑定一个 格式 logger对象 绑定 文件管理操作符
logger对象 绑定 屏幕管理操作符
import logging
# 创建一个logger对象
logger = logging.getLogger()
# 创建一个文件管理操作符
fh = logging.FileHandler('logger.log',encoding='utf-8')
# 创建一个屏幕管理操作符
sh = logging.StreamHandler()
# 创建一个日志输出的格式
format1 = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') # 文件管理操作符 绑定一个 格式
fh.setFormatter(format1)
# 屏幕管理操作符 绑定一个 格式
sh.setFormatter(format1)
logger.setLevel(logging.DEBUG)
# logger对象 绑定 文件管理操作符
# logger.addHandler(fh)
# logger对象 绑定 屏幕管理操作符
logger.addHandler(sh) logger.debug('debug message') # 调试模式
logger.info('我的信息') # 基础信息
logger.warning('warning message') # 警告
logger.error('error message') # 错误
logger.critical('critical message')# 严重错误

python常用模块详解2的更多相关文章

  1. python常用模块详解

    python常用模块详解 什么是模块? 常见的场景:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀. 但其实import加载的模块分为四个通用类别: 1 使用p ...

  2. python常用模块详解(一)

    一.简介 模块是一个保存了Python代码的文件.模块能定义函数,类和变量.模块里也能包含可执行的代码 模块分为三种: 自定义模块 内置标准模块 开源模块(第三方) 自定义模块: 模块导入 impor ...

  3. Python Fabric模块详解

    Python Fabric模块详解 什么是Fabric? 简单介绍一下: ​ Fabric是一个Python的库和命令行工具,用来提高基于SSH的应用部署和系统管理效率. 再具体点介绍一下,Fabri ...

  4. python time模块详解

    python time模块详解 转自:http://blog.csdn.net/kiki113/article/details/4033017 python 的内嵌time模板翻译及说明  一.简介 ...

  5. Ansible安装部署及常用模块详解

    Ansible命令使用 Ansible语法使用ansible <pattern_goes_here> -m <module_name> -a <arguments> ...

  6. python docopt模块详解

    python docopt模块详解 docopt 本质上是在 Python 中引入了一种针对命令行参数的形式语言,在代码的最开头使用 """ ""&q ...

  7. (转)python collections模块详解

    python collections模块详解 原文:http://www.cnblogs.com/dahu-daqing/p/7040490.html 1.模块简介 collections包含了一些特 ...

  8. python pathlib模块详解

    python pathlib模块详解    

  9. python time 模块详解

    Python中time模块详解 发表于2011年5月5日 12:58 a.m.    位于分类我爱Python 在平常的代码中,我们常常需要与时间打交道.在Python中,与时间处理有关的模块就包括: ...

随机推荐

  1. virtualbox+vagrant学习-4-Vagrantfile-3-Minimum Vagrant Version

    Minimum Vagrant Version 可以在Vagrantfile中指定一组vagrant版本需求,以强制人们使用带有Vagrantfile文件的vagrant特定版本.这可以帮助解决使用带 ...

  2. Laravel发送邮件配置-问题解决

    MAIL_DRIVER=smtp MAIL_HOST=smtp..com MAIL_PORT= MAIL_USERNAME=phpfangzhan@@@@@.com MAIL_PASSWORD=*** ...

  3. 程序猿,你为什么须要一台mac?

    用了Mac ,我再也回不去Windows. A:帅哥,我电脑坏了. B:重装系统吧.包好! 重装系统 windows系统解决全部系统问题的一剂神药.Mac 时代再也不须要做这种劳命伤財的事情了,没有什 ...

  4. 前端基础-HTML的的标签详解

    阅读目录 一.head内常用标签 二. HTML语义化 三. 字符实体 四. h系列标签 五. p标签 六. img标签 七. a标签 八. 列表标签 九. table标签 十. form标签 一. ...

  5. oo第二次总结作业

    OO电梯作业总结 这三周的作业和课堂内容以及OS的课上内容都相同,都是关于多线程方面的知识.在这次作业中由浅入深布置了三项多线程电梯方面的作业,让我们在实践中感受了多线程的工作原理以及各项需要注意的要 ...

  6. 数组的定义和使用,理解多维数组和Array类

    数组的作用 在执行程序的过程中,通常会需要存储大量数据.如果只有少量数据,那么通过声明变量,存储到变量中即可.但当我们的数据是20个.40个甚至是100以上时,就意味着需要声明很多变量,这是不现实的, ...

  7. (Oracle)DBMS_SYSTEM工具-01[20180510]

    分析描述:     使用DBMS_SYSTEM分析SQL语句执行,并且获取SQL会话中的绑定变量.等待事件.消耗资源和执行计划等等. 环境介绍:     Oracle 11.2.0.4.0     L ...

  8. 虚拟机与ARM之间的交叉编译总结

    通过三大服务的配置,我们可以在ARM中下载内核和文件系统.我们通过在虚拟机中编程,得到的程序不能在ARM中运行,需要经过一个交叉编译.得到的可执行程序可以在ARM中运行,此时不能在虚拟机Linux中运 ...

  9. redis学习指南

    一.redis安装 # 安装最新版 yum install -y epel-release vim atop htop net-tools git wget gcc-c++ yum clean all ...

  10. 1.Hadoop集群安装部署

    Hadoop集群安装部署 1.介绍 (1)架构模型 (2)使用工具 VMWARE cenos7 Xshell Xftp jdk-8u91-linux-x64.rpm hadoop-2.7.3.tar. ...