一、time&random模块
print(time.localtime(1596097258.078811))
aa = time.localtime(1596097258.078811)
time.sleep(1)
print(time.mktime(aa))
print(time.asctime())
print(time.strftime("%Y-%m-%d %H:%M", time.localtime())) # 显示本地时间
print(time.strptime('2017-10-3 17:54', "%Y-%m-%d %H:%M")) #将时间字符转换成字符串
import datetime
print(datetime.date.today()) #当前日期
print(datetime.datetime.now()) #现在时间
import random
print(random.randrange(1, 10)) # 一到十的随机数
print(random.randrange(0, 100, 2)) #0到100的随机数步长为2
print(random.random())
二、序列化pickle&json模块
定义:将一种数据结构如列表,字典,元组等转换成特殊的序列
为什么存在序列化?
-
数据存储再文件中,str形式存储,比如字典
-
数据通过网络传输(bytes类型),不能还原回去
-
特色的字符串:序列化
1、以某种存储形式使自定义对象持久化;
2、将对象从一个地方传递到另一个地方。
3、使程序更具维护性。
2.1 pickle模块
- 只能是python语言遵循的一种数据转换格式,只能再python语言中使用
- 支持python所有数据类型,包括实例化对象
dumps和loads 只能用于网络传输
import pickle
dic = {'username':'老王','password':'123','status':'true'}
st = pickle.dumps(dic) #转换为二进制数据
print(st,type(st))
l2 = pickle.loads(st) #将二进制数据还原成转换之前的类型
print(l2,type(l2))
dump和load可直接写入,还能转换多个数据
import pickle
dic = {'username':'老王'}
dic1 = {'username':'老王1'}
dic2 = {'username':'老王2'}
f = open('pick多数据',mode='wb')
pickle.dump(dic,f) #将多行数据转换成二进制格式
pickle.dump(dic1,f)
pickle.dump(dic2,f)
f.close()
f = open('pick多数据',mode='rb')
print(pickle.load(f)) #将二进制数据进行还原
print(pickle.load(f))
print(pickle.load(f))
f.close()
pickle 将函数对象进行转换
import pickle
def func():
print('in func')
f = open('pickle11',mode='wb')
pickle.dump(func,f) #将函数转换从二进制
f.close()
f = open('pickle11',mode='rb')
ret = pickle.load(f) #将二进制数据进行还原
print(ret)
ret()
2.2 json模块
- 将数据结构转换成特殊的字符串,并且可以反转回去
两对四种方法
网络传输
dumps loads 主要用于网络传输,但是也可以写入文件
import json
dumps loads
st = json.dumps(dic,ensure_ascii=False)
print(st,type(st))
dic1 = json.loads(st)
print(dic1,type(dic1))
# 转换成特殊的字符转写入文件
with open('json文件',encoding='utf8',mode='w') as f1:
st = json.dumps(dic)
f1.write(st)
# 读取出来还原
with open('json文件',encoding='utf8',mode='r') as f2:
st = f2.read()
l1 = json.loads(st)
print(l1,type(l1))
dump load 只能写入文件,只能写入一个数据结构
# dump load 只能写入文件,只能写入一个数据结构
dic = {'username':'老王','password':'123','status':'true'}
with open('json文件1',encoding='utf-8',mode='w') as f1:
json.dump(dic,f1)
# 读取数据
dic = {'username':'老王','password':'123','status':'true'}
with open('json文件1',encoding='utf-8') as f1:
ll = json.load(f1)
print(ll,type(ll))
一次写入文件多个数据怎么做?用dumps 和 loads
dic = {'username':'老王'}
dic1 = {'username':'老王1'}
dic2 = {'username':'老王2'}
with open('json2文件',encoding='utf8',mode='w') as f1:
f1.write(json.dumps(dic) + '
')
f1.write(json.dumps(dic1) + '
')
f1.write(json.dumps(dic2) + '
')
with open('json2文件',encoding='utf8',mode='r') as f1:
for i in f1:
print(json.loads(i))
三、hashlib模块
包括很多加密算法,MD5,sh1 sha256 sha512
-
密码加密,不已 密文形式存储密码
-
文件的校验
用法:
- 将bytes类型字节,转化成 固定长度的16进制数字组成的字符串
- 不同的bytes类型利用相同的算法(MD5)转换的结果一定不同
- 相同的bytes利用相同的算法(MD5)转换成的结果一定相同
- hashlib的算法是不可逆的(MD5被中国王晓云破解了)
计算字符串MD5的值
import hashlib
s1 = 'sadfsadtgyq3ewrasdfvcsas拉拉设计的'
ret = hashlib.md5()
ret.update(s1.encode('utf-8'))
print(ret.hexdigest())
例子:校验用户登陆
import hashlib
def passwo(pwd):
ret = hashlib.md5()
ret.update(pwd.encode('utf-8'))
return ret.hexdigest()
def regidter():
username = input("请输入一个用户名:").strip()
password = input('请输入密码:').strip()
password_md5 = passwo(password)
with open('register',encoding='utf-8',mode='a') as f1:
f1.write(f'
{username}|{password_md5}')
regidter()
def login():
username = input("请输入一个用户名:").strip()
password = input('请输入密码:').strip()
passs_md5 = passwo(password)
bidui = (f'{username}|{passs_md5}')
with open('register',encoding='utf-8',mode='r') as f1:
readlines = f1.readlines()
b = []
for i in readlines:
a = i.strip()
if a == bidui:
b.append(a)
if not b:
print('用户名不存在或者密码错误')
else:
print(f'登录成功你的用户名|密码为:{b[0]}')
login()
MD5加盐
import hashlib
s2 = "123"
ret = hashlib.md5('12'.encode('utf-8')) #这里的12就是加的盐,把12换成动态可变的就是动态加盐
ret.update(s2.encode('utf-8'))
print(ret.hexdigest())
sha系列 ,金融类,安全类,用这个级别
随着sha系列数字越高,加密越复杂,越不容易破解,但是耗时越长
s2 = 'sadfasdfsdfa'
ret = hashlib.sha3_512()
ret.update(s2.encode('utf-8'))
print(ret.hexdigest())
文件校验
import hashlib
# 文件校验
def file_md5(path):
ret = hashlib.sha3_256()
with open(path,encoding='utf-8',mode='r') as f1:
b1 = f1.read()
ret.update(b1.encode('utf-8'))
return ret.hexdigest()
reesult = file_md5('json文件')
print(reesult)
四、文件copy模块shutil
shutil.copyfileobj(fsrc, fdst[, length])
将文件内容拷贝到另一个文件中
import shutilshutil.copyfileobj(open('old.xml','r'), open('new.xml', 'w'))
shutil.copyfile(src, dst)
拷贝文件
shutil.copyfile('f1.log', 'f2.log') #目标文件无需存在
shutil.copymode(src, dst)
仅拷贝权限。内容、组、用户均不变
shutil.copymode('f1.log', 'f2.log') #目标文件必须存在
shutil.copystat(src, dst)
仅拷贝状态的信息,包括:mode bits, atime, mtime, flags
shutil.copystat('f1.log', 'f2.log') #目标文件必须存在
shutil.copy(src, dst)
拷贝文件和权限
import shutilshutil.copy('f1.log', 'f2.log')
shutil.copy2(src, dst)
拷贝文件和状态信息
import shutilshutil.copy2('f1.log', 'f2.log')
shutil.ignore_patterns(*patterns)
shutil.copytree(src, dst, symlinks=False, ignore=None)
递归的去拷贝文件夹
import shutilshutil.copytree('folder1', 'folder2', ignore=shutil.ignore_patterns('*.pyc', 'tmp*')) #目标目录不能存在,注意对folder2目录父级目录要有可写权限,ignore的意思是排除
shutil.rmtree(path[, ignore_errors[, onerror]])
递归的去删除文件
import shutilshutil.rmtree('folder1')
shutil.move(src, dst)
递归的去移动文件,它类似mv命令,其实就是重命名。
import shutilshutil.move('folder1', 'folder3')
shutil.make_archive(base_name, format,…)
创建压缩包并返回文件路径,例如:zip、tar
可选参数如下:
- base_name: 压缩包的文件名,也可以是压缩包的路径。只是文件名时,则保存至当前目录,否则保存至指定路径,
如 data_bak =>保存至当前路径
如:/tmp/data_bak =>保存至/tmp/
- format: 压缩包种类,“zip”, “tar”, “bztar”,“gztar”
- root_dir: 要压缩的文件夹路径(默认当前目录)
- owner: 用户,默认当前用户
- group: 组,默认当前组
- logger: 用于记录日志,通常是logging.Logger对象
#将 /data 下的文件打包放置当前程序目录
import shutil
ret = shutil.make_archive("data_bak", 'gztar', root_dir='/data')
#将 /data下的文件打包放置 /tmp/目录
import shutil
ret = shutil.make_archive("/tmp/data_bak", 'gztar', root_dir='/data')
shutil 对压缩包的处理是调用 ZipFile 和 TarFile 两个模块来进行的,详细:
zipfile压缩&解压缩tarfile压缩&解压缩
import tarfile
# 压缩
>>> t=tarfile.open('/tmp/egon.tar','w')
>>> t.add('/test1/a.py',arcname='a.bak')
>>> t.add('/test1/b.py',arcname='b.bak')
>>> t.close()
# 解压
>>> t=tarfile.open('/tmp/egon.tar','r')
>>> t.extractall('/egon')
>>> t.close()