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) + '
')
    f1.write(json.dumps(dic2, ensure_ascii=False) + '
')
    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)
View Code

总结:  

  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写多个字典到文件
# 利用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()
View Code

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文件进行修改,必须要添加这个参数
View Code

import  hashlib

给密码加密

文件的校验

hashlib:将str类型,通过算法 -----> 一串等长度的数字

1、不同的字符串,转化成数字肯定不同

2、相同的字符串即使在不同的计算机上只要使用相同的加密方式,转化的数字一定相同

3、hashlib加密不可逆,不能破解

MD5

普通版,容易破解

import hashlib
ret = hashlib.md5()
ret.update('123'.encode('utf-8'))
print(ret.hexdigest())  # 202cb962ac59075b964b07152d234b70

静态加盐版:

import hashlib
ret = hashlib.md5('verygood'.encode('utf-8'))  #
#  加盐,给每一个密码添加verygood后,在计算md5码
ret.update('123456'.encode('utf-8'))
print(ret.hexdigest())

动态加盐:

import hashlib
username = input('用户名: ')
ret = hashlib.md5(username[::2].encode('utf-8'))  #
#  动态加盐,给每一个密码添加切片后的用户名,在计算md5码
ret.update('123456'.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'))
View Code

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下为"	
",Linux下为"
"
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的大小
View Code

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)
View Code

3.Counter: 计数器,主要用来计数

from collections import Counter
# s1 = '电脑电脑sldfjslffdsaf'
s1 = ['电脑','电脑','电脑','电脑','']
c = Counter(s1)
print(c)
print(dict(c))  # {'电脑': 4, '书': 1}
View Code

4.OrderedDict: 有序字典

5.defaultdict: 带有默认值的字典

 

原文地址:https://www.cnblogs.com/echo2019/p/10243775.html