python模块使用(序列化、随机数、os、sys、hashlib)

模块:

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

注:json写入文件是w模式,因为是字符串,如果要写wb模式,需要再把json的字符串类型转成bytes类型

# ensure_ascii=False 不编码
# indet=2 可视化输出(加换行 + 缩进(2个空格))
json.dump(self.data, f, ensure_ascii=False, indent=2)

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

注: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
"""
View Code

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

对文件夹的操作:

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

运行系统命令:

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

系统相关的操作:

# 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’
View Code

路径的操作:

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

判断操作:

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

# 删除非空文件夹

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

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
原文地址:https://www.cnblogs.com/zezhou/p/10559459.html