模块
json模块
用于多种语言交互 编程语言中的通用数据
内置的模块 不需要安装,直接导入使用
import json 导入一个json模块
dic = {'1':2}
s = json.jumps(dic) 将字典对象转换成字符串
print(types)
d = json.loads(s) 将字符串转换成字典
print(d)
print(type(d))
json.dump({'1':4,open('a','w',encoding='utf-8')) 写入文件
d = json.load(open('a','r',encoding='utf-8')) 读文件
d['1'] = 10 修改文件
json.dump(d,open('a','w',encoding='utf-8')) 把字典d写入到文件a里
d = json.load(open('a','r',encoding='utf-8')) 读文件
print(d)
import json dic = {'k1':'v1','k2':'v2','k3':'v3'} str_dic = json.dumps(dic) #序列化:将一个字典转换成一个字符串 print(type(str_dic),str_dic) #<class 'str'> {"k3": "v3", "k1": "v1", "k2": "v2"} #注意,json转换完的字符串类型的字典中的字符串是由""表示的 dic2 = json.loads(str_dic) #反序列化:将一个字符串格式的字典转换成一个字典 #注意,要用json的loads功能处理的字符串类型的字典中的字符串必须由""表示 print(type(dic2),dic2) #<class 'dict'> {'k1': 'v1', 'k2': 'v2', 'k3': 'v3'} list_dic = [1,['a','b','c'],3,{'k1':'v1','k2':'v2'}] str_dic = json.dumps(list_dic) #也可以处理嵌套的数据类型 print(type(str_dic),str_dic) #<class 'str'> [1, ["a", "b", "c"], 3, {"k1": "v1", "k2": "v2"}] list_dic2 = json.loads(str_dic) print(type(list_dic2),list_dic2) #<class 'list'> [1, ['a', 'b', 'c'], 3, {'k1': 'v1', 'k2': 'v2'}] loads和dumps dumps loads
import json f = open('json_file','w') dic = {'k1':'v1','k2':'v2','k3':'v3'} json.dump(dic,f) #dump方法接收一个文件句柄,直接将字典转换成json字符串写入文件 f.close() f = open('json_file') dic2 = json.load(f) #load方法接收一个文件句柄,直接将文件中的json字符串转换成数据结构返回 f.close() print(type(dic2),dic2) dump load
1 import json 2 3 ATM 4 5 d = json.load(open('a','r',encoding='utf-8')) 6 print(d) 7 8 d['money'] += 500 9 10 print(d) 11 12 d['money'] -= 100 13 14 import json 15 d = json.load(open('a','r',encoding='utf-8')) 16 print(d)
json总结
json.loda() 参数:文件句柄(r) 作用:将文件中字符串转换为字典
json.dump() 对象(字典) 参数:文件句柄(w) 将字典转换成字符串写入到文件
json.dumps() 对象(字典) 将字典转为字符串
json.loads() 字符串(字典) 将字符串转换成字典
真正的json模块
import json
data = {'username':['李华','二愣子'],'sex':'male','age':16}
json_dic2 = json.dumps(data,sort_keys=True,indent=2,separators=(',',':'),ensure_ascii=False) (字典名,字典键值对排序,缩进,分隔符(和默认一样),元素内有中文就要有这个)
print(json_dic2)
pickle
只支持python 功能和json类似
import pickle
print(pickle.dumps({'1':4})) 将对象转换成类似二进制的东西
print(pickle.loads(b'x80x03}qx00Xx01x00x00x001qx01Kx04s.')) 将一堆类似二进制的东西转换为字典
pickle.dump({'2':4},open('b','wb'))
d = pickle.load(open('b','rb'))
print(d)
import pickle dic = {'k1':'v1','k2':'v2','k3':'v3'} str_dic = pickle.dumps(dic) print(str_dic) #一串二进制内容 dic2 = pickle.loads(str_dic) print(dic2) #字典 import time struct_time = time.localtime(1000000000) print(struct_time) f = open('pickle_file','wb') pickle.dump(struct_time,f) f.close() f = open('pickle_file','rb') struct_time2 = pickle.load(f) print(struct_time2.tm_year) pickle
总结
josn,pickle 对比
loads json里的将字符串转换成字典 pickle 将字节转换成字典
dumps json里的将字典转换成字符串 pickle 将字典转换成字节
load json里的将文件中的字符串转换成字典 pickle 将文件中的字节转换成字典
dump json里的将字典转换字符串写入到文件中 pickle 将字典转换成字节写入到文件中
shelve
shelve也是python提供给我们的序列化工具,比pickle用起来更简单一些。
shelve只提供给我们一个open方法,是用key来访问的,使用起来和字典类似。
import shelve f = shelve.open('shelve_file') f['key'] = {'int':10, 'float':9.5, 'string':'Sample data'} #直接对文件句柄操作,就可以存入数据 f.close() import shelve f1 = shelve.open('shelve_file') existing = f1['key'] #取出数据的时候也只需要直接用key获取即可,但是如果key不存在会报错 f1.close() print(existing)
这个模块有个限制,它不支持多个应用同一时间往同一个DB进行写操作。所以当我们知道我们的应用如果只进行读操作,我们可以让shelve通过只读方式打开DB
import shelve f = shelve.open('shelve_file', flag='r') existing = f['key'] f.close() print(existing)
由于shelve在默认情况下是不会记录待持久化对象的任何修改的,所以我们在shelve.open()时候需要修改默认参数,否则对象的修改不会保存。
import shelve f1 = shelve.open('shelve_file') print(f1['key']) f1['key']['new_value'] = 'this was not here before' f1.close() f2 = shelve.open('shelve_file', writeback=True) print(f2['key']) f2['key']['new_value'] = 'this was not here before' f2.close() 设置writeback
writeback方式有优点也有缺点。优点是减少了我们出错的概率,并且让对象的持久化对用户更加的透明了;但这种方式并不是所有的情况下都需要,首先,使用writeback以后,shelf在open()的时候会增加额外的内存消耗,并且当DB在close()的时候会将缓存中的每一个对象都写入到DB,这也会带来额外的等待时间。因为shelve没有办法知道缓存中哪些对象修改了,哪些对象没有修改,因此所有的对象都会被写入
random
随机数
import random
import random # 内置的
print(random.random())
0-1 之间随机小数
print(random.randint(1,10))
起始位置,终止位置 两头都包含
print(random.randrange(1,21,2))
起始位置,终止位置(不包含),步长
print(random.choice(['alex','wusir','eva_j']))
从有序数据结构中随机选择一个
print(random.choices(['wusir','tialaing','taihei','ritian'],k=2))
随机选择两个,但是有重复
print(random.sample(['wusir','tialaing','taihei','ritian'],k=2))
随机选择两个,没有重复
li = [1,2,3,4,6]
random.shuffle(li) # 洗牌 打乱顺序
print(li)
随机数 验证码 微信红包
U = chr(random.randrange(65,91))
L = chr(random.randrange(97,123))
n1 = random.randrange(0,10)
n2 = random.randrange(0,10)
print(U, L,n1,n2)
os模块
当前执行这个python文件的工作目录相关的工作路径
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.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.join('C:\','app','a','b') ---> C:appa
os.path.getatime(path) 返回path所指向的文件或者目录的最后访问时间
os.path.getmtime(path) 返回path所指向的文件或者目录的最后修改时间
os.path.getsize(path) 返回path的大小
sys模块
python解释器交互的 内置的
import sys
print(sys.argv[-1]) ***
接受cmd方式调用 后边的参数会传递进来
linux系统上 -- 后端开发 -- 数据库(文件) ip + 端口
print(sys.path) # 添加自定义模块路径的 # ******
print(sys.version) # 版本 获取解释的版本号
sys.platform = 'win1988'
print(sys.platform) #获取当前操作系统的平台位数 # 不是定死的
print(sys.exit(1))
hashlib
加密算法
作用: 当做密码
判断一致性
加密后不可逆 不能解 (一年前暴力破解 -- 撞库)
(现在md5 可以通过反推破译出来)
sha1,sha256,sha512
alex3714
**********
import hashlib
md5 = hashlib.md5('盐'.encode('utf-8')) # 选择加密方式 加盐
md5.update('alex3714'.encode('utf-8')) # 将明文转成字节然后进行加密
print(md5.hexdigest()) # 生成密文
md5 = hashlib.md5() # 选择加密方式 加盐
md5.update('alex3714'.encode('utf-8')) # 将明文转成字节然后进行加密
print(md5.hexdigest()) # 生成密文
sha512 = hashlib.sha512()
sha512.update('alex3714'.encode('utf-8'))
print(sha512.hexdigest())
sha512
优点: 安全 缺点:速度慢
md5
优点:安全,快 缺点:易被破解
user,pwd = input('user|pwd:').strip().split('|')
import hashlib
md5 = hashlib.md5(str(user).encode('utf-8'))
md5.update(pwd.encode('utf-8'))
print(md5.hexdigest())
md5,sha1,sha256,sha512
重要内容
1.序列化
json # 必会
dump 把字典转成字符串存入文件
load 将文件的字符串转成字典
dumps 将字典转成字符串
loads 将字符串转成字典
pickle # 了解
shevle # 了解
2. 随机数
random.random() 0-1 之间的小数
验证码
random.randint(1,10)
3. os 操作系统
路径部分
os.path.join
os.path.abspath
os.path.basename
os.path.dirname
os.path.getsize() # 获取大小
os.remove()
os.rename()
os.listdir()
os.chdir() # 切换目录
os.makedirs('app/a/b') 递归创建文件夹
os.removedirs('app/a/b') 递归删除
os.mkdir() 创建单个文件夹
os.rmdir() 删除单个文件夹
4. sys python解释器
sys.argv() 在cmd中执行 可以将文件 后的内容传递到文件中使用
sys.path python解释器加载的路径,自定义模块添加到这里
sys.exit()
sys.version() 获取解释器的版本号
sys.platform 获取当前平台的位数
5. hashlib 加密算法
md5,sha1,sha256,sha512
1.先导入模块
2.创建一个加密方式
3.将要加密的内容编码成字节后加密
4.生成密文
import hashlib
md5 = hashlib.md5(b'alex')
md5.update('alex3714'.encode('utf-8'))
print(md5.hexdigest())