模块:
1.json,pickle,shelve
2.random
3.os
4.sys
5.hashlib
1.json,pickle,shelve
序列化:
把内存数据转成字符串或字节,叫作序列化
把字符串或字节转成内存里的数据类型,叫作反序列化
序列化的目的:
1.将数据永久保存 2.用于网络传输 3.使程序更具维护性
数据类型转成字符串存到内存的意义: json.dumps及json.loads
1.把内存的数据,通过网络传输共享给远程其他人,因为网络传输是1010的大串数字 2.定义了不同语言之间的交互规则 交互规则: 1.纯文本,坏处是不能共享复杂的数据类型(比如字典) 2.xml,坏处是占空间大 3.json,简单可读性好
json和pickle的区别:
1.支持的数据类型: json:str,int,tuple,list,dict pickle:支持所有的数据类型 2.pickle只能在python中使用,而json可以跨平台 3.pickle支持序列化函数 4.json转成的是str类型,pickle转成的是bytes类型
json模块的用法:
dumps(value) # 把数据转换成字符串 loads(str_value) # 把字符串转换成原来的类型 dump(value, file) # 把数据转成字符串写入文件中 load(file) # 把数据从文件读入内存转换成原来的类型
使用:
import json # json主要用于字典和列表转换成字符串,不同语言之间可以相互传输数据 d = {'1':2,'2':3,'3':4} # dumps 把数据转换成字符串,要用于网络传输需要先encode str_d = json.dumps(d) print(str_d,type(str_d)) # {"1": 2, "2": 3, "3": 4} <class 'str'> # loads 把字符串转成该数据类型 dic = json.loads(str_d) print(dic,type(dic)) # {'1': 2, '2': 3, '3': 4} <class 'dict'> # dump 把数据写入文件 json.dump(d,open('data.json','w',encoding='utf-8')) # load 把文件里的数据读取到dic dic = json.load(open('data.json','r',encoding='utf-8')) print(dic,type(dic)) # {'1': 2, '2': 3, '3': 4} <class 'dict'>
注:json写入文件是w模式,因为是字符串,如果要写wb模式,需要再把json的字符串类型转成bytes类型
pickle模块的用法:
和json一样,但是转成的数据类型不同,pickle直接转成bytes类型。
使用:
import pickle # pickle只用于python之前传输数据,可以各种数据类型 d = {'1':2,'2':3,'3':4} # dumps 把数据转成bytes类型,可以直接用于网络传输 byte_d = pickle.dumps(d) print(byte_d) #b'\x80\x03}q\x00(X\x01\x00\x00\x001q\x01K\x02X\x01\x00\x00\x002q\x02K\x03X\x01\x00\x00\x003q\x03K\x04u.' # loads 把bytes类型数据转成原有类型 dic = pickle.loads(byte_d) print(dic) # dump 把数据写入文件以二进制形式打开文件写入 pickle.dump(d,open('data.pkl','wb')) # load 把数据从文件以二进制模式导出内容,dic接收内容 dic = pickle.load(open('data.pkl','rb')) print(dic)
注:pickle写入文件时候需要是wb模式
shelve模块:
对pickle进行的封装,python独有,作用是可存多个变量内容不会乱,key:value的存储形式。
用法:
f = shelve.open(filename) # 首先打开文件 字典的各种操作。 f.close() # 用完关闭文件
使用:
import shelve # 创建文件,写入内容,会生成3份.bak 、 .data和.dir文件 f = shelve.open('data.shl') f['name'] = 'zezhou' f['age'] = 19 f.close() # 读取文件数据 f = shelve.open('data.shl') for key in f: print(key,f[key]) f.close() """ name zezhou age 19 """
2.random
取随机值的模块,也可以打乱列表顺序。
用法:
random.random() # 取0-1的随机小数 random.uniform(start,end) # 取start-end的随机小数 random.randint(start,end) # 取start-end区间包括头尾的整数 random.randrange(start,end,step) # 取start-end+步长的整数,例可以取一个随机奇数 random.choice(iterable) # 取一个可迭代对象的随机的一个数,注可迭代对象必须支持索引 random.choices(iterable,k=1) # 随机取一个或多个指定列表的元素,k默认为1表示取一个,取多个会有重复,注可迭代对象必须支持索引 random.sample(iterable,k=num) # 随机取一个或多个指定列表的元素,k必须指定如k=2表示取二个,去多个没有重复,注可迭代对象必须支持索引 random.shuffle(iterable) # 打乱一个可迭代对象的排列,注可迭代对象必须支持索引
使用:
import random # 获得一个0-1的随机小数 a = random.random() print(a) # 0.6788278582812177 # 获得一个指定区间的随机小数 a = random.uniform(1,5) print(a) # 2.1725147621792904 # 获得一个1-10(包括1和10)随机的整数 a = random.randint(1,10) print(a) # 8 # 获得一个1-10的随机奇数 a = random.randrange(1,10,2) print(a) # 7 # 获得指定列表的随机的一个元素 a = random.choice(['wzz','zz','111']) print(a) # 'zz' # print(random.choice({1,2,3,4})) # 不能放没有索引的数据类型 # k可以指定返回几个随机内容,会有重复,默认k=1 a = random.choices(['wzz','zz','111']) print(a) # ['wzz'] # k指定返回几个随机内容,不会有重复,必须有k参数 a = random.sample(['wzz','zz','111','222'],k=2) print(a) # ['zz', '111'] # shuffle 可以打乱列表顺序,必须支持索引 lis = [i for i in range(1,11)] # lis = {1,2,3,4} random.shuffle(lis) print(lis) # [3, 10, 8, 6, 2, 1, 7, 9, 5, 4]
3.os
针对操作系统的。
注:需要先导入improt os
对文件的操作:
# remove 删除文件,找不到会报错FileNotFoundError os.remove('test.txt') # rename 修改文件名称 os.mkdir('test') os.rename('test','123') # listdir 获取路径下的内容,默认不写是以python执行当前路径 print(os.listdir()) # ['day13作业.py', 'register', 'test.py', '内置函数.py', '装饰器'] # stat 返回文件或文件夹的信息 print(os.stat('os模块.py')) # os.stat_result(st_mode=33206, st_ino=14918173765665585, st_dev=2728164148, \ # st_nlink=1, st_uid=0, st_gid=0, st_size=1599, st_atime=1552986929, \ # st_mtime=1552986929, st_ctime=1552986929) # 获取单个值,文件的大小 print(os.stat('os模块.py').st_size)
对文件夹的操作:
# mkdir 创建文件夹,存在报错FileExistsError os.mkdir('ttt') # rmdir 删除文件夹,找不到报错FileNotFoundError os.rmdir('ttt') # makedirs 递归创建文件夹,存在FileExistsError os.makedirs(r'test\1\2\3\4') # removedirs 递归删除文件夹,存在文件或文件夹报错OSError os.removedirs(r'test\1\2\3\4')
运行系统命令:
# system 运行系统命令 os.system('shutdown -s -t 100') # shutdown -a 解除 # 中文会乱码 os.system('ping 127.0.0.1') # popen 运行系统命令,不会显示乱码 data = os.popen('ipconfig') print(data.read()) data.close()
系统相关的操作:
# name 打印当前使用平台 print(os.name) # windows为‘nt’,Linux为‘postix’ # environ 返回系统所有的环境变量 print(os.environ) # 字典形式显示 # getenv 返回环境变量该key的value print(os.getenv('USERNAME')) # Administrator # linesep 返回当前平台的换行符 print(repr(os.linesep)) # '\r\n' # windows为’\r\n’,linux为’\n’
路径的操作:
# getcwd获取当前工作路径 print(os.getcwd()) # F:\PyCharm\python project\python20\day14 # chdir 切换路径 os.chdir(r'..\day13') print(os.getcwd()) # F:\PyCharm\python project\python20\day13 # path.join 路径拼接 print(os.path.join('D:\\','123','456')) # D:\123\456 # 返回文件的绝对路径 print(os.path.abspath('test.py')) # F:\PyCharm\python project\python20\day14\test.py # 返回文件路径,去掉一层路径 print(os.path.dirname(r'F:\PyCharm\python project\python20\day14\test.py')) # F:\PyCharm\python project\python20\day14 path = r'F:\PyCharm\python project\python20\day14\test.py' print(os.path.dirname(os.path.dirname(path))) # F:\PyCharm\python project\python20 # path.getsize 获取文件大小,用的其实是stat的st_size print(os.path.getsize('random模块.py')) # 1029 # path.split 以最后一个路径分割符切割成一个元祖 print(os.path.split(os.path.join(os.getcwd(),'test.py'))) # ('F:\\PyCharm\\python project\\python20\\day14', 'test.py') # 返回文件名 print(os.path.basename(r'F:\PyCharm\python project\python20\day14\test.py')) # test.py
判断操作:
# path.exists 判断文件是否存在 print(os.path.exists('123')) # False # path.isfile 判断是否是文件 print(os.path.isfile('day14')) # False # path.isdir 判断是否是文件夹 os.mkdir('test') print(os.path.isdir('test')) # True
# 删除非空文件夹
import shutil
shutil.rmtree(目录路径)
4.sys
针对python解释器的。
操作:
import sys # 可以将cmd用户输入的内容传到文件内使用 print(sys.argv) """ F:\PyCharm\python project\python20\day14>python sys模块.py ip=127.0.0.1 port=8000 ['sys模块.py', 'ip=127.0.0.1', 'port=8000'] """ # 退出的状态码,默认为0(表示正常退出) sys.exit(8) # Process finished with exit code 8 # 返回python解释器版本 print(sys.version) # 3.6.8 (tags/v3.6.8:3c6b436a57, Dec 24 2018, 00:16:47) [MSC v.1916 64 bit (AMD64)] # 返回python的环境变量,如果要自定义模块需要添加路径否则找不到 print(sys.path) # 返回一个列表形式 # 返回操作系统平台名称 print(sys.platform) # win32 # 标准输出 sys.stdout.write('zezhou') # zezhou # 标准输入,readline 一行 data = sys.stdin.readline() print(data) # hello world! # hello world! # 获取最大递归层数,默认1000,实际998、997 print(sys.getrecursionlimit()) # 1000 # 设置最大递归层数 sys.setrecursionlimit(1100) print(sys.getrecursionlimit()) # 1100 # 获取解释器默认编码,python3默认是utf-8 print(sys.getdefaultencoding()) # utf-8 # 获取内存数据存入文件的默认编码 print(sys.getfilesystemencoding()) # utf-8
5.hashlib
摘要算法通常应用于网站存储用户的帐号密码相关信息。默认情况下,我们插入到数据库的帐号密码都是以明文保存。这样的话,一旦数据库泄露,所有用户的口令都会直接泄露,而且明文保存,网站管理员也可以直接查看到用户口令,这样及不安全。所以我们可以在获取到用户输入的密码以后,直接对其进行加密处理。然后将加密的字符串存入数据库。这样当下次用户登录时,再对用户输入的密码进行加密处理,然后与数据库中存储的加密字串进行比对,如果匹配,则说明密码正确。
加密算法:
1.md5
2.sha1
3.sha256
4.sha512
作用:
1.加密后当作用户密码
2.判断文件一致性(文件有一点变动hash值都不同)
通常会加“盐”使其更安全: # “盐”可以是用户名
import hashlib # md5值是唯一的,不可逆(现在已经可以破解了。) username = 'zezhou' password = 'qwer123' md5 = hashlib.md5(username.encode('utf-8')) # 选择加密方式,加"盐",需要先转换成bytes类型 md5.update(password.encode('utf-8')) # 将明文转成bytes类型再转换成密文 print(md5.hexdigest()) # 生成密文 # 547115b1db23d54c8cd93e2e8dd26cd3
sha1算法: # 比md5更安全一点,更长点
import hashlib sha1 = hashlib.sha1() sha1.update('123456'.encode('utf-8')) print(sha1.hexdigest()) # 7c4a8d09ca3762af61e59520943dc26494f8941b