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("登录成功")
posted @ 2019-08-04 21:40  yangchangjie  阅读(139)  评论(0编辑  收藏  举报