python-json-pickle-shelve-random-os-sys-hashlib
json模块
JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式。JSON的数据格式其实就是python里面的字典格式,里面可以包含方括号括起来的数组,也就是python里面的列表。
json中四种方法:
- dumps:将数据类型(字典,列表)转换为字符串
- loads:将字符串转换为数据类型
- dump:将数据类型转化为字符串存储的文件中
- load:将文件中的字符串转换为数据类型
dumps和loads
d = json.dumps({"a": 123, "b": "123"}) # 序列化:将字典转化为字符串
print(d, type(d)) # {"a": 123, "b": "123"} <class 'str'>
res = json.loads(d) # 反序列化:将字符串转化为字典
res["a"] = 456 # 修改字典的值
print(res, type(res)) # {'a': 456, 'b': '123'} <class 'dict'>
list_dic = [1, ['a', 'b', 'c'], 3, {'k1': 'v1', 'k2': 'v2'}]
str_list = json.dumps(list_dic)
print(str_list,type(str_list)) # [1, ["a", "b", "c"], 3, {"k1": "v1", "k2": "v2"}] <class 'str'>
list_str = json.loads(str_list)
print(list_str, type(list_str)) # [1, ['a', 'b', 'c'], 3, {'k1': 'v1
dump和load
d = json.dump({"a": 123}, open('a', 'w', encoding='utf-8')) # 序列化 将字典转化为字符串之后存储在文件a中
# 具有持久化 存储在文件中
d1 =json.load(open("a",'r', encoding='utf-8') # 反序列化 将文件中的字符串转换为字典
print(d1, type(d1)) # {'a': 123} <class 'dict'>
# json格式化输出
data = {'username': ['李华', '二愣子'], 'sex': 'male', 'age': 16}
json_dic2 = json.dumps(data, sort_keys=True, indent=2, separators=(',', ':'), ensure_ascii=False)
print(json_dic2)
'''输出格式
{
"age":16,
"sex":"male",
"username":[
"李华",
"二愣子"
]
}
'''
pickle模块
json,用于字符串 和 python数据类型间进行转换 pickle,用于python特有的类型 和 python的数据类型间进行转换 pickle模块提供了四个功能:dumps、dump(序列化,存)、loads(反序列化,读)、load (不仅可以序列化字典,列表...可以把python中任意的数据类型序列化)pickle是python特有的模块.
import pickle
dic = {'k1': 'v1', 'k2': 'v2', 'k3': 'v3'}
p = pickle.dumps(dic) # 序列化 返回来的是一串类似于二进制
print(p, type(p)) # b'\x80\x03}q\x00(X\x02\x00\x00\x00k1q\x01X\x02\x00\x00\x00v1q\x02X\x02\x00\x00\x00k2q\x03X\x02\x00\x00\x00v2q\x04X\x02\x00\x00\x00k3q\x05X\x02\x00\x00\x00v3q\x06u.' <class 'bytes'>
p1 = pickle.loads(p) # 反序列化
print(p1) # {'k1': 'v1', 'k2': 'v2', 'k3': 'v3'}
d = pickle.dump(dic,open('a', 'wb')) # 序列化 将字典转化为类似二进制文件存储在文件中
d1 = pickle.load(open('a', 'rb'))
print(d1) # {'k1': 'v1', 'k2': 'v2', 'k3': 'v3'}
}
总结:
json模块里的dumps是将python的数据结构转换成字符串,loads是将字符串类型转换成python的数据结构
json模块里的dump是将python的数据结构转换成字符串,然后存入到文件当中
json模块里的loads是将文件中字符串类型转换成python的数据结构
pickle模块里的dump是将python的数据结构转换成二进制的文件,loads是将二进制的文件转换成python的
数据结构
pickle模块里的dump是将python的数据结构转换成二进制然后存入到文件中
pickle模块里的load是将文件中的二进制文件转成python的数据结构
shelve模块
import shelve
f = shelve.open('c')# 将会生三个文件c.bak,c.dat,c.dir
f["name"] = "Tom" # 操作和字典一样
f["age"] = 1000
print(f["name"]) # Tom
print(f['age']) # 1000
for i in f.items():
print(i, end=' ') # ('name', 'Tom') ('age', 1000)
for i in f.keys():
print(i, end=" ") # name age
for i in f.values():
print(i, end=' ') # Tom 1000
random模块
import random
# 产生0<x<1的随机数 浮点数
ret = random.random()
print(ret) # 0.2811136727298186
# 参数一定范围的随机数
ret1 = random.randint(1, 10) # 是包含前后的范围的,整数
print(ret1) # 4
ret2 = random.randrange(1, 10, 2) # 前后都不包含,可以加步长 产生1-10之间的整数
print(ret2) # 5
ret3 = random.choice([1, 2, 3, 4, 5]) # 在列表中随机选择 对应不能索引的数据类型(set,dict)在不能进行此操作
print(ret3) # 1
ret4 = random.choices([1, 2, 3, 4, 5], k=2) # 在列表中选取多个数据,且可以重复出现
print(ret4) # [3, 5]
ret5 = random.sample([1, 2, 3, 4, 5], k=2) # 在列表中选取多个数据,且不会重复出现
print(ret5) # [4, 3]
a = [1, 2, 3, 4, 5]
random.shuffle(a) # 随机打乱,洗牌操作
print(a) # [3, 1, 4, 5, 2]
ret6 = random.uniform(1, 3) # 生成一定范围的浮点数
print(ret6) # 2.0001839915476123
os模块
os模块是与操作系统交互的接口
和文件夹操作
import os
os.makedirs("python/bin") # 可生成多层递归目录
os.removedirs("python/bin") # 若目录为空,则删除,并递归到上一节目录,若为空,则删除,以此类推
os.mkdir("dirname") # 创建单级目录
os.rmdir("dirname") # 删除单级目录
ret = os.listdir(r'F:\oldboy_code\day_13') # 列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印
print(ret)
和文件先关
import os
os.remove("c.bak") # 删除一个文件
os.rename('old_name','new_name') # 重命名文件/目录
ret = os.stat(r'F:\oldboy_code\day_13\a') # 获取文件/目录信息
print(ret)
'''
os.stat_result(st_mode=33206, st_ino=14073748835640376, st_dev=3026493691, st_nlink=1, st_uid=0, st_gid=0, st_size=62, st_atime=1552982111, st_mtime=1552982111, st_ctime=1552963154)
'''
和操作系统差异相关
>>> os.sep # 输出操作系统特定的路径分隔符,win下为"\\",Linux下为"/"
'\\'
>>> os.linesep # 输出当前平台使用的行终止符,win下为"\r\n",Linux下为"\n"
'\r\n'
>>> os.pathsep # 输出用于分割文件路径的字符串 win下为;,Linux下为:
';'
>>> os.name # 输出字符串指示当前使用平台。win->'nt'; Linux->'posix'
'nt'
和执行命令相关
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的大小<br></em>
os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径
os.chdir("dirname") 改变当前脚本工作目录;相当于shell下cd
os.curdir 返回当前目录: ('.')
os.pardir 获取当前目录的父目录字符串名:('..')
测试:
import os
os.remove("c.bak") # 删除一个文件
os.rename('old_name','new_name') # 重命名文件/目录
ret = os.stat(r'F:\oldboy_code\day_13\a')
print(ret)
ret = os.path.abspath('homework13') # 相对路径 获取到绝对路径
print(ret) # F:\oldboy_code\day_13\homework13
ret1 = os.path.split(r'F:\oldboy_code\day_13\b')
print(ret1) # ('F:\\oldboy_code\\day_13', 'b') # 将绝对路径分为目录和文件
ret2 = os.path.dirname(r'F:\oldboy_code\day_13\b')
print(ret2) # F:\oldboy_code\day_13 获取文件的目录
ret3 = os.path.basename(r'F:\oldboy_code\day_13\b')
print(ret3) # b 获取文件名
ret4 = os.path.isabs('b') # 判断是不是绝对路径
print(ret4) # False
ret5 = os.path.exists("a") # 判断路径是否存在
print(ret5) # True
ret6 = os.path.isfile('a') # 如果存在一个文件,返回true 否则是False
print(ret6)
ret7 = os.path.join('C:\\', 'app', 'a', 'b')
print(ret7) # C:\app\a\b
ret8 = os.path.getsize('a') # 获取文件的大小
print(ret8)
os.stat('path/filename') 获取文件/目录信息 的结构说明
stat 结构:
st_mode: inode 保护模式
st_ino: inode 节点号。
st_dev: inode 驻留的设备。
st_nlink: inode 的链接数。
st_uid: 所有者的用户ID。
st_gid: 所有者的组ID。
st_size: 普通文件以字节为单位的大小;包含等待某些特殊文件的数据。
st_atime: 上次访问的时间。
st_mtime: 最后一次修改的时间。
st_ctime: 由操作系统报告的"ctime"。在某些系统上(如Unix)是最新的元数据更改的时间,在其它系统上(如Windows)是创建时间(详细信息参见平台的文档)。
sys模块
sys模块是与python计解释器交互的一个接口
sys.argv 命令行参数List,第一个元素是程序本身路径
sys.exit(n) 退出程序,正常退出时exit(0),错误退出sys.exit(1)
sys.version 获取Python解释程序的版本信息
sys.path 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
sys.platform 返回操作系统平台名称
测试
>>> import sys
>>> sys.version
'3.6.4 |Anaconda, Inc.| (default, Jan 16 2018, 10:22:32) [MSC v.1900 64 bit (AMD64)]'
>>> sys.path
['', 'G:\\Sofeware\\Anaconda\\python36.zip', 'G:\\Sofeware\\Anaconda\\DLLs', 'G:\\Sofeware\\Anaconda\\lib', 'G:\\Sofeware\\Anaconda', 'G:\\Sofeware\\Anaconda\\lib\\site-packages', 'G:\\Sofeware\\Anaconda\\lib\\site-packages\\win32', 'G:\\Sofeware\\Anaconda\\lib\\site-packages\\win32\\lib', 'G:\\Sofeware\\Anaconda\\lib\\site-packages\\Pythonwin']
>>> sys.platform
'win32'
>>> sys.argv
['']
>>> sys.exit(0)
hashlib模块
hashlib是常见的摘要算法,摘要算法,通过摘要函数f()对任意长度的数据data计算出固定的长度的摘要digest,目的是为了发现原始数据是否被人篡改过。
摘要算法之所以能指出数据是否被篡改过,就是因为摘要函数是一个单向函数,计算f(data)很容易,但通过digest反推data却非常困难。而且,对原始数据做一个bit的修改,都会导致计算出的摘要完全不同。
也md5进行测试
import hashlib
md5 = hashlib.md5() # 速度快,现在不安全了, 也被破解
md5.update("password".encode('utf-8'))
print(md5.hexdigest()) # 5f4dcc3b5aa765d61d8327deb882cf99
sh = hashlib.sha3_512() # 比md5更加的安全 但是速度慢
sh.update('password'.encode('utf-8'))
print(sh.hexdigest()) # e9a75486736a550af4fea861e2378305c4a555a05094dee1dca2f68afea49cc3a50e8de6ea131ea521311f4d6fb054a146e8282f8e35ff2e6368c1a62e909716
# 加盐操作
md5 = hashlib.md5("盐".encode('utf-8')) # 加盐在操作
md5.update('password'.encode('utf-8'))
print(md5.hexdigest()) # fffe343da367b45368df0f90391812b6 加盐操作和不加盐操作的秘文是不一样的
# 简单的运用
import hashlib
username1 = 'Yang'
password1 = '123'
md5 = hashlib.md5(username1.encode('utf-8'))
md5.update(password1.encode('utf-8'))
code_name_password = md5.hexdigest()
print(code_name_password)
username = input("name:").strip()
password = input("password:").strip()
md5 = hashlib.md5(username.encode('utf-8'))
md5.update(password.encode('utf-8'))
code_name_password1 = md5.hexdigest()
if code_name_password1 == code_name_password:
print("登录成功")