day15 json,os,sys,hashlib
序列化模块
import json
# json 序列化模块 是所有语言通用的一种标准(数据转化格式)。
# str int bool dict list(tuple) None import pickle
# pickle 序列化模块 只是支持python语言之间的互相传输。
# python语言的所有数据类型 对象 都可以进行网络传递
# 写入文件时 可以写入多个。 import shelve # 了解
# shelve 序列化模块 只是支持python语言,与文件相关。
# 第一对方法:dumps loads 与网络传输相关
dic = {'name': "太白金星", 'hobby_list': ['戒烟', '烫不了头', '戒酒']}
print(dic)
s = json.dumps(dic,ensure_ascii=False) # 序列化过程
print(s,type(s))
dic1 = json.loads(s) # 反序列化过程
print(dic1, type(dic1))
dumps loads
# 第二对 dump load 与文件相关
dic = {'name': "太白金星", 'hobby_list': ['戒烟', '烫不了头', '戒酒']}
with open('序列化.json', encoding='utf-8', mode='w') as f1:
json.dump(dic, f1, ensure_ascii=False) with open('序列化.json', encoding='utf-8',) as f2:
ret = json.load(f2)
print(ret, type(ret))
dump load
# 参数讲解:
dic = {'name': "太白金星",
'hobby_list': ['戒烟', '烫不了头', '戒酒'],
'age': 18,
'money': '1个亿'}
print(dic)
s = json.dumps(dic,ensure_ascii=False,sort_keys=True,separators=('|',',')) # 序列化过程
# sort_keys 按键排序
# ensure_ascii=False 显示中文
# separators=('|',',') 设置分隔符 没有意义
参数讲解
json 和 bytes的区别
bytes 只能操作str,用于网路传输
json 可操作 str , int,bool,dict,list,(tuple),None用于网路传输,文件存储
用json将多个字典写入一个文件
# 如果用dump load 一个文件只能写入一个数据结构
dic1 = {'name': '春哥'}
dic2 = {'name': '子伍'}
dic3 = {'name': '王子'}
with open('多个字典.json',encoding='utf-8',mode='w') as f1:
f1.write(json.dumps(dic1, ensure_ascii=False) + '\n')
f1.write(json.dumps(dic2, ensure_ascii=False) + '\n')
f1.write(json.dumps(dic3, ensure_ascii=False)) with open('多个字典.json',encoding='utf-8',mode='r') as f1:
for line in f1:
print(json.loads(line))
ret1 = json.loads(f1.read())
ret2 = json.loads(f1.read())
ret3 = json.loads(f1.read())
print(ret1, ret2, ret3)
总结:
dumps loads用于网络传输和多个数据写入文件
dump load 只能用于一个数据结构写入文件
注意:
# 坑:
dic = {1: 'alex'} # 如果键是数字,自动转字符串
ret = json.dumps(dic)
print(ret)
print(json.loads(ret))
import pickle
dumps loads 用于网络传输 :将数据结构 ----> 转化成bytes
dic = {'name': "太白金星",
'hobby_list': ['戒烟', '烫不了头', '戒酒'],
'age': 18,
'money': '1个亿'}
s1 = pickle.dumps(dic)
print(s1) # 是bytes字符显示,不能显示任何其他类型
dic2 = pickle.loads(s1)
print(dic2)
dic = {'name': "太白金星",
'hobby_list': ['戒烟', '烫不了头', '戒酒'],
'age': 18,
'money': '1个亿'}
with open('p1.pickle',mode='wb') as f1: # wb: bytes形式
pickle.dump(dic, f1) # 操作文件用dump
with open('p1.pickle',mode='rb') as f1:
dic1 = pickle.load(f1) # 注意要用load
print(dic1)
dump, load
# 利用dump load 将多个数据写入文件
dic1 = {'name': '春哥'}
dic2 = {'name': '子伍'}
dic3 = {'name': '王子'}
with open('p2.pickle',mode='wb') as f1:
pickle.dump(dic1, f1)
pickle.dump(dic2, f1)
pickle.dump(dic3, f1)
with open('p2.pickle', mode='rb') as f2:
print(pickle.load(f2))
print(pickle.load(f2))
print(pickle.load(f2))
dump写多个文件
def func():
print(666) with open('p3.pickle',mode='wb') as f1:
pickle.dump(func,f1) #函数名写入文件 with open('p3.pickle',mode='rb') as f1:
ret = pickle.load(f1)
ret() # ret() == func()
json 和 pickle
这里我们要说明一下,json是一种所有的语言都可以识别的数据结构。
如果我们将一个字典或者序列化成了一个json存在文件里,那么java代码或者js代码也可以拿来用。
但是如果我们用pickle进行序列化,其他语言就不能读懂这是什么了~
所以,如果你序列化的内容是列表或者字典,我们非常推荐你使用json模块
但如果出于某种原因你不得不序列化其他的数据类型,而未来你还会用python对这个数据进行反序列化的话,那么就可以使用pickle
import shelve # 了解
# shelve序列化模块,只是支持python语言,与文件相关
import shelve
f = shelve.open('shelve_file')
f['key'] = {'int':10, 'float':9.5, 'string':'Sample data'} #直接对文件句柄操作,就可以存入数据
f.close()
# 给文件写入一个字典:{'key':{'int':10, 'float':9.5, 'string':'Sample data'}} f = shelve.open('shelve_file')
print(f['key'])
f.close() import shelve
f1 = shelve.open('shelve_file',writeback=True)
print(f1['key'])
f1['key']['new_value'] = 'this was not here before'
f1.close() f1 = shelve.open('shelve_file')
print(f1['key'])
f1.close()
# writeback=True 如果相对shelve文件进行修改,必须要添加这个参数
import hashlib
给密码加密
文件的校验
hashlib:将str类型,通过算法 -----> 一串等长度的数字
1、不同的字符串,转化成数字肯定不同
2、相同的字符串即使在不同的计算机上只要使用相同的加密方式,转化的数字一定相同
3、hashlib加密不可逆,不能破解
MD5
普通版,容易破解
import hashlib
ret = hashlib.md5()
ret.update(''.encode('utf-8'))
print(ret.hexdigest()) # 202cb962ac59075b964b07152d234b70
静态加盐版:
import hashlib
ret = hashlib.md5('verygood'.encode('utf-8')) #
# 加盐,给每一个密码添加verygood后,在计算md5码
ret.update(''.encode('utf-8'))
print(ret.hexdigest())
动态加盐:
import hashlib
username = input('用户名: ')
ret = hashlib.md5(username[::2].encode('utf-8')) #
# 动态加盐,给每一个密码添加切片后的用户名,在计算md5码
ret.update(''.encode('utf-8'))
print(ret.hexdigest())
md5 加密效率快,通用,安全性相对差
sha系列,算法更好 安全性高,效率低,耗时长
import hashlib
# ret = hashlib.sha1()
# ret.update('gjfds;gfjdgfkdg;lfdkg;fdlgk;fldgk;fldg'.encode('utf-8'))
# print(ret.hexdigest())
#
#
# ret = hashlib.sha512()
# ret.update('gjfds;gfjdgfkdg;lfdkg;fdlgk;fldgk;fldg'.encode('utf-8'))
# print(ret.hexdigest())
sha加密
文件的校验
小文件校验
import hashlib
def check_md5(file):
ret = hashlib.md5()
with open(file, mode='rb') as f1:
ret.update(f1.read()) # 读全文
return ret.hexdigest()
print(check_md5('文件校验1'))
print(check_md5('文件校验2'))
小文件校验
大文件校验
import hashlib
def check_md5(file):
ret = hashlib.md5()
with open(file, mode='rb') as f1:
while 1:
count = f1.read(1024) # 每次读1204个字节
if count: # 文件最后一次读为空,count为False 走else
ret.update(count)
else:
break
return ret.hexdigest()
print(check_md5('文件校验1'))
print(check_md5('文件校验2'))
os模块:
os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 ***
os.chdir("dirname") 改变当前脚本工作目录;相当于shell下cd
os.curdir 返回当前目录: ('.')
os.pardir 获取当前目录的父目录字符串名:('..') #和文件夹相关
os.makedirs('dirname1/dirname2') 可生成多层递归目录 ***
os.removedirs('dirname1') 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推
os.mkdir('dirname') 生成单级目录;相当于shell中mkdir dirname **
os.rmdir('dirname') 删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname
os.listdir('dirname') 列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印 ** # 和文件相关
os.remove() 删除一个文件 ***
os.rename("oldname","newname") 重命名文件/目录 ***
os.stat('path/filename') 获取文件/目录信息 # 和操作系统差异相关
os.sep 输出操作系统特定的路径分隔符,win下为"\\",Linux下为"/"
os.linesep 输出当前平台使用的行终止符,win下为"\t\n",Linux下为"\n"
os.pathsep 输出用于分割文件路径的字符串 win下为;,Linux下为:
os.name 输出字符串指示当前使用平台。win->'nt'; Linux->'posix' # 和执行系统命令相关
os.system("bash command") 运行shell命令,直接显示
os.popen("bash command).read() 运行shell命令,获取执行结果
os.environ 获取系统环境变量 #path系列,和路径相关 ***
os.path.abspath(path) 返回path规范化的绝对路径
os.path.split(path) 将path分割成目录和文件名二元组返回
os.path.dirname(path) 返回path的目录。其实就是os.path.split(path)的第一个元素
os.path.basename(path) 返回path最后的文件名。如何path以/或\结尾,那么就会返回空值,即os.path.split(path)的第二个元素。
os.path.exists(path) 如果path存在,返回True;如果path不存在,返回False
os.path.isabs(path) 如果path是绝对路径,返回True
os.path.isfile(path) 如果path是一个存在的文件,返回True。否则返回False
os.path.isdir(path) 如果path是一个存在的目录,则返回True。否则返回False
os.path.join(path1[, path2[, ...]]) 将多个路径组合后返回,第一个绝对路径之前的参数将被忽略
os.path.getatime(path) 返回path所指向的文件或者目录的最后访问时间
os.path.getmtime(path) 返回path所指向的文件或者目录的最后修改时间
os.path.getsize(path) 返回path的大小
SYS模块
sys.argv 命令行参数List,第一个元素是程序本身路径
sys.exit(n) 退出程序,正常退出时exit(0),错误退出sys.exit(1)
sys.version 获取Python解释程序的版本信息
sys.path 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
sys.platform 返回操作系统平台名称
import sys
try:
sys.exit('意外中断....')
except SystemExit as e:
print(e)
异常处理
collections模块
1.namedtuple: 生成可以使用名字来访问元素内容的tuple
2.deque: 双端队列,可以快速的从另外一侧追加和推出对象
from collections import deque
q = deque(['a','b','c'])
print(q)
# 从右边增加值
q.append('x')
q.append('y')
# 从右边删除值
q.pop()
q.pop()
# 从左边增值
q.appendleft('x')
q.appendleft('y')
# 从左边删除
q.popleft()
q.popleft()
print(q)
3.Counter: 计数器,主要用来计数
from collections import Counter
# s1 = '电脑电脑sldfjslffdsaf'
s1 = ['电脑','电脑','电脑','电脑','书']
c = Counter(s1)
print(c)
print(dict(c)) # {'电脑': 4, '书': 1}
4.OrderedDict: 有序字典
5.defaultdict: 带有默认值的字典
day15 json,os,sys,hashlib的更多相关文章
- Python进阶(九)----json模块, pickle模块, os模块,sys模块,hashlib模块
Python进阶----json模块, pickle模块, os模块,sys模块,hashlib模块 一丶序列化模块 什么是序列化: 将一种数据结构,转换成一个特殊的序列(特殊字符串,用于网络传输 ...
- Py修行路 python基础 (二十)模块 time模块,random模块,hashlib模块,OS及sys模块
一.前提介绍: 可以开辟作用域的只有类,函数,和模块 for循环 if,else: 不能开辟自己的作用域 避免程序复用和重复调用,将这些写到一个.py文件中,做成一个模块,进行调 ...
- Python 第五篇(上):算法、自定义模块、系统标准模块(time 、datetime 、random 、OS 、sys 、hashlib 、json和pickle)
一:算法回顾: 冒泡算法,也叫冒泡排序,其特点如下: 1.比较相邻的元素.如果第一个比第二个大,就交换他们两个. 2.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对.在这一点,最后的元素应 ...
- python,os操作文件,文件路径(上一级目录)
python获取文件上一级目录:取文件所在目录的上一级目录 os.path.abspath(os.path.join(os.path.dirname('settings.py'),os.path.pa ...
- day13 函数模块之序列化 random 模块 os模块 sys模块 hashlib模块 collections模块
json import json dic = {'k1':'v1','k2':'v2','k3':'v3'} str_dic = json.dumps(dic) #序列化:将一个字典转换成一个字符串 ...
- day17——序列化、os、sys、hashlib、collections
day17 序列化 json 两组4个方法: 1.dumps(序列化) -- loads(反序列) dumps(list):将对象转换成字符串 loads(str):将字符串转换成对象 list--s ...
- python常用模块json、os、sys
一.序列化 json & pickle 模块 json--用于字符串和Python数据类型间进行转换 pickle---用于python特有的类型和Python的数据类型间进行转换 json: ...
- Python3 os模块&sys模块&hashlib模块
''' os模块 非常重要的模块 ''' import os # print(os.getcwd()) # 获取当前工作目录 # os.chdir(r'路径名') # 改变当前工作目录 # print ...
- time模块 datetime 模块 random 模块 OS 模块 sys 模块 hashlib 模块
time模块 在python中的时间表现形式: 时间戳 (自1970-01-01-00-00 到当前时间,按秒计算,一共过了多少秒 格式化时间 返回的是时间的字符串 格式化时间对象 返回的是一个元组 ...
- Day5- Python基础5 模块导入、time、datetime、random、os、sys、hashlib、json&pickle
本节目录: 1.模块的分类 2.模块的导入 3.time模块 4.datetime模块 5.random 6.os模块 7.sys模块 8.hashlib 9.json&pickle 一.模块 ...
随机推荐
- 2.Geany安装后编译器配置
生成 --> 设置生成命令 --> Compile & Execute : C:\Users\29742\AppData\Local\Programs\Python\Python ...
- Haskell语言学习笔记(71)Semigroup
Semigroup class Semigroup a where (<>) :: a -> a -> a sconcat :: NonEmpty a -> a stim ...
- 二叉堆复习(包括d堆)
要期中考了……我真的是什么也不会啊,书都没看过TAT. 好吧整理一下二叉堆,这里就以最大堆为例好了. 首先二叉堆其实是一棵CBT,满足父节点的键值大于左右子节点的键值(wikipedia把这个叫键值, ...
- 吴裕雄 30-MySQL 及 SQL 注入
如果您通过网页获取用户输入的数据并将其插入一个MySQL数据库,那么就有可能发生SQL注入安全的问题.本章节将为大家介绍如何防止SQL注入,并通过脚本来过滤SQL中注入的字符.所谓SQL注入,就是通过 ...
- python 2.0 与 python 3.0 区别
区别一: python 2.0 : 源码不规范,重复代码很多 python 3.0 : 源码精简,美观.优雅 区别二: PY2 : 有整型int.长整型long. py3:只有整型 ...
- Latex公式示范
\(A_\alpha(x)\) \(\qquad\) \(a^2+b^2=c^2 \) \(\qquad\) \(\sum\limits_{m=0}^\inft ...
- 初识Elasticsearch,bulk 操作的遇到的那些事
bulk api可以在单个请求中一次执行多个文档的 create . index . update 或 delete 操作 批量操作的行为(action)必须是以下几种: 行为 解释 create 当 ...
- hadoop zookeeper高可用
原文地址: https://blog.csdn.net/dingchenxixi/article/details/51131493 core-site.xml yarn-site.xml
- metasploit framework(十一):获取漏洞信息
查看参数 这个模块运行需要一个session 所以需要先获取到一个session 就获得了一个session 再回到枚举补丁模块 添加session 查看参数看到session已经添加上去了 run ...
- hibernate ORA-17059 无法转换为内部表示
参考 https://jingyan.baidu.com/article/2fb0ba40a25a2b00f2ec5fc7.html 数据库里的字段类型与Java实体类中的对应字段属性类型不匹配