一.时间模块优先掌握的操作
一:time
import time
时间分为三种格式:
1、时间戳:从1970年到现在经过的秒数
作用:用于时间间隔的计算
print(time.time())
2、按照某种格式显示的时间:2020-03-30 11:11:11
作用:用于展示时间
print(time.strftime('%Y-%m-%d %H:%M:%S %p'))
print(time.strftime('%Y-%m-%d %X'))
3、结构化的时间
作用:用于单独获取时间的某一部分
res=time.localtime()
print(res)
print(res.tm_year)
print(res.tm_yday)
二:datetime
1 import datetime
2
3 print(datetime.datetime.now())
4 print(datetime.datetime.now() + datetime.timedelta(days=-3))
5 print(datetime.datetime.now() + datetime.timedelta(weeks=1))
时间模块需要掌握的操作
1 1、时间格式的转换
2 struct_time->时间戳
3 import time
4 s_time=time.localtime()
5 print(time.mktime(s_time))
6
7 时间戳->struct_time
8 tp_time=time.time()
9 print(time.localtime(tp_time))
10
11 补充:世界标准时间与本地时间
12 print(time.localtime())
13 print(time.gmtime()) # 世界标准时间,了解
14 print(time.localtime(333333333))
15 print(time.gmtime(333333333))
16
17
18 struct_time->格式化的字符串形式的时间
19 s_time=time.localtime()
20 print(time.strftime('%Y-%m-%d %H:%M:%S',s_time))
21
22 print(time.strptime('1988-03-03 11:11:11','%Y-%m-%d %H:%M:%S'))
23
24
25 !!!真正需要掌握的只有一条:format string<------>timestamp
26 '1988-03-03 11:11:11'+7
27
28 format string--->struct_time--->timestamp
29 struct_time=time.strptime('1988-03-03 11:11:11','%Y-%m-%d %H:%M:%S')
30 timestamp=time.mktime(struct_time)+7*86400
31 print(timestamp)
32
33 format string<---struct_time<---timestamp
34 res=time.strftime('%Y-%m-%d %X',time.localtime(timestamp))
35 print(res)
36
37 time.sleep(3)
38
39 了解知识
40 import time
41 print(time.asctime())
42
43
44 import datetime
45 print(datetime.datetime.now())
46 print(datetime.datetime.utcnow())
47
48 print(datetime.date
二.random模块
import random
print(random.random()) #(0,1)----float 大于0且小于1之间的小数
print(random.randint(1, 3)) # [1,3] 大于等于1且小于等于3之间的整数
print(random.randrange(1, 3)) # [1,3) 大于等于1且小于3之间的整数
print(random.choice([111, 'aaa', [4, 5]])) # 1或者23或者[4,5]
print(random.sample([111, 'aaa', 'ccc','ddd'],2)) # 列表元素任意2个组合
print(random.uniform(1, 3)) # 大于1小于3的小数,如1.927109612082716
item = [1, 3, 5, 7, 9]
random.shuffle(item) # 打乱item的顺序,相当于"洗牌"
print(item)
应用:随机验证码
import random
res=''
for i in range(6):
从26大写字母中随机取出一个=chr(random.randint(65,90))
从10个数字中随机取出一个=str(random.randint(0,9))
随机字符=random.choice([从26大写字母中随机取出一个,从10个数字中随机取出一个])
res+=随机字符
import random
def make_code(size=4):
res=''
for i in range(size):
s1=chr(random.randint(65,90))
s2=str(random.randint(0,9))
res+=random.choice([s1,s2])
return res
print(make_code(6))
三 os模块
os模块是与操作系统交互的一个接口
1 os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径
2 os.chdir("dirname") 改变当前脚本工作目录;相当于shell下cd
3 os.curdir 返回当前目录: ('.')
4 os.pardir 获取当前目录的父目录字符串名:('..')
5 os.makedirs('dirname1/dirname2') 可生成多层递归目录
6 os.removedirs('dirname1') 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推
7 os.mkdir('dirname') 生成单级目录;相当于shell中mkdir dirname
8 os.rmdir('dirname') 删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname
9 os.listdir('dirname') 列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印
10 os.remove() 删除一个文件
11 os.rename("oldname","newname") 重命名文件/目录
12 os.stat('path/filename') 获取文件/目录信息
13 os.sep 输出操作系统特定的路径分隔符,win下为"\",Linux下为"/"
14 os.linesep 输出当前平台使用的行终止符,win下为"
",Linux下为"
"
15 os.pathsep 输出用于分割文件路径的字符串 win下为;,Linux下为:
16 os.name 输出字符串指示当前使用平台。win->'nt'; Linux->'posix'
17 os.system("bash command") 运行shell命令,直接显示
18 os.environ 获取系统环境变量
19 os.path.abspath(path) 返回path规范化的绝对路径
20 os.path.split(path) 将path分割成目录和文件名二元组返回
21 os.path.dirname(path) 返回path的目录。其实就是os.path.split(path)的第一个元素
22 os.path.basename(path) 返回path最后的文件名。如何path以/或结尾,那么就会返回空值。即os.path.split(path)的第二个元素
23 os.path.exists(path) 如果path存在,返回True;如果path不存在,返回False
24 os.path.isabs(path) 如果path是绝对路径,返回True
25 os.path.isfile(path) 如果path是一个存在的文件,返回True。否则返回False
26 os.path.isdir(path) 如果path是一个存在的目录,则返回True。否则返回False
27 os.path.join(path1[, path2[, ...]]) 将多个路径组合后返回,第一个绝对路径之前的参数将被忽略
28 os.path.getatime(path) 返回path所指向的文件或者目录的最后存取时间
29 os.path.getmtime(path) 返回path所指向的文件或者目录的最后修改时间
30 os.path.getsize(path) 返回path的大小
os路径处理
#方式一:推荐使用
import os
#具体应用
import os,sys
possible_topdir = os.path.normpath(os.path.join(
os.path.abspath(__file__),
os.pardir, #上一级
os.pardir,
os.pardir
))
sys.path.insert(0,possible_topdir)
#方式二:不推荐使用
os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
import os
获取某一个文件夹下所有的子文件以及子文件夹的名字
res=os.listdir('.')
print(res)
size=os.path.getsize(r'/Users/linhaifeng/PycharmProjects/s14/day22/01 时间模块.py')
print(size)
os.remove() 删除一个文件
os.rename("oldname","newname") 重命名文件/目录
应用程序----》"ls /"
os.system("ls /")
规定:key与value必须都为字符串
os.environ['aaaaaaaaaa']='111'
print(os.environ)
print(os.path.dirname(r'/a/b/c/d.txt'))
print(os.path.basename(r'/a/b/c/d.txt'))
print(os.path.isfile(r'笔记.txt'))
print(os.path.isfile(r'aaa'))
print(os.path.isdir(r'aaa'))
print(os.path.join('a','/','b','c','d'))
推荐用这种
BASE_DIR=os.path.dirname(os.path.dirname(__file__))
print(BASE_DIR)
BASE_DIR=os.path.normpath(os.path.join(
__file__,
'..',
'..'
))
print(BASE_DIR)
在python3.5之后,推出了一个新的模块pathlib
from pathlib import Path
res = Path(__file__).parent.parent
print(res)
res=Path('/a/b/c') / 'd/e.txt'
print(res)
print(res.resolve())
四 sys模块
1 sys.argv 命令行参数List,第一个元素是程序本身路径
2 sys.exit(n) 退出程序,正常退出时exit(0)
3 sys.version 获取Python解释程序的版本信息
4 sys.maxint 最大的Int值
5 sys.path 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
6 sys.platform 返回操作系统平台名称
import sys
python3.8 run.py 1 2 3
sys.argv获取的是解释器后参数值
print(sys.argv)
src_file=input('源文件路径: ').strip()
dst_file=input('目标文件路径: ').strip()
src_file=sys.argv[1]
dst_file=sys.argv[2]
# 判断
with open(r'%s' %src_file,mode='rb') as read_f,
open(r'%s' %dst_file,mode='wb') as write_f:
for line in read_f:
write_f.write(line)
python3.8 run.py src_file dst_file
print('[%-50s]' %'#')
print('[%-50s]' %'##')
print('[%-50s]' %'###')
import time
res=''
for i in range(50):
res+='#'
time.sleep(0.5)
print('
[%-50s]' % res,end='')
import time
def progress(percent):
if percent > 1:
percent = 1
res = int(50 * percent) * '#'
print('
[%-50s] %d%%' % (res, int(100 * percent)), end='')
recv_size=0
total_size=1025011
while recv_size < total_size:
time.sleep(0.01) # 下载了1024个字节的数据
recv_size+=1024 # recv_size=2048
打印进度条
print(recv_size)
percent = recv_size / total_size # 1024 / 333333
progress(percent)
五 shutil模块
高级的 文件、文件夹、压缩包 处理模块
shutil.copyfileobj(fsrc, fdst[, length])
将文件内容拷贝到另一个文件中
import shutil
shutil.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 shutil
hutil.copy('f1.log', 'f2.log')
shutil.copy2(src, dst)
拷贝文件和状态信息
import shutil
shutil.copy2('f1.log', 'f2.log')
shutil.ignore_patterns(*patterns)
shutil.copytree(src, dst, symlinks=False, ignore=None)
递归的去拷贝文件夹
import shutil shutil.copytree('folder1', 'folder2', ignore=shutil.ignore_patterns('*.pyc', 'tmp*')) #目标目录不能存在,注意对folder2目录父级目录要有可写权限,ignore的意思是排除
import shutil
shutil.copytree('f1', 'f2', symlinks=True, ignore=shutil.ignore_patterns('*.pyc', 'tmp*'))
#通常的拷贝都把软连接拷贝成硬链接,即对待软连接来说,创建新的文件
shutil.rmtree(path[, ignore_errors[, onerror]])
递归的去删除文件
import shutil
shutil.rmtree('folder1')
shutil.move(src, dst)
递归的去移动文件,它类似mv命令,其实就是重命名。
import shutil
shutil.move('folder1', 'folder3')
shutil.make_archive(base_name, format,...)
创建压缩包并返回文件路径,例如:zip、tar
创建压缩包并返回文件路径,例如: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 两个模块来进行的,详细:
1 import zipfile
2
3 # 压缩
4 z = zipfile.ZipFile('laxi.zip', 'w')
5 z.write('a.log')
6 z.write('data.data')
7 z.close()
8
9 # 解压
10 z = zipfile.ZipFile('laxi.zip', 'r')
11 z.extractall(path='.')
12 z.close()
1 import tarfile
2
3 # 压缩
4 >>> t=tarfile.open('/tmp/egon.tar','w')
5 >>> t.add('/test1/a.py',arcname='a.bak')
6 >>> t.add('/test1/b.py',arcname='b.bak')
7 >>> t.close()
8
9
10 # 解压
11 >>> t=tarfile.open('/tmp/egon.tar','r')
12 >>> t.extractall('/egon')
13 >>> t.close()
14
15 tarfile压缩解压缩
六 json&pickle模块
一:什么是序列化 & 反序列化
序列化 指的是 把内存的数据类型 转换成一个 特定的格式的内容
改格式的内容 可用于 存储或者传输给其他平台使用
序列化:内存中的数据类型 ==> 序列化 ==> 特定的格式(json格式 或 pickle格式)
反序列化:特定的格式(json格式 或 pickle格式) ==> 序列化 ==> 内存中的数据类型
土办法:
# {'aaa':111} ==> 序列化 str({'aaa':111}) ==> "{'aaa':111}"
# "{'aaa':111}" ==> 反序列化 eval({'aaa':111}) ==> {'aaa':111}
二:为什么要有序列化
序列化得到的结果 ==> 特定的格式的内容有2种用途
1.可用于存储 ==> 用于存档
2.传输给其他平台使用 ==> 跨平台数据交互
Python Java
列表 特定的格式 数组
强调:
针对用途1的特定——格式:这是一种专用的格式==>pickle只有Python可以识别
针对用途2的特定——格式:应该是一种通用,能够被所有语言识别的格式==>json
只是自己存档自己用:用pickle
存档==>自己用
三:如何序列化与反序列化
import json
json_res = json.dumps(True)
print(json_res,type(json_res)) # 序列化 输出:true <class 'str'>
import json
json_res = json.dumps([1, 'aaa', True, False])
print(json_res, type(json_res)) # 序列化 输出:[1, "aaa", true, false] <class 'str'>
import json
l = json.loads(json_res)
print(l, type(l)) # 反序列化 输出:[1, 'aaa', True, False] <class 'list'>
序列化的结果写入文件的复杂方法
import json
json_res = json.dumps([1, 'aaa', True, False])
with open('test.json', mode='wt', encoding='UTF-8') as f1:
f1.write(json_res)
将序列化的结果写入文件的简单方法
import json
with open('test.json', mode='wt', encoding='UTF-8') as f1:
json.dump([1, 'aaa', True, False], f1)
从文件读取json格式的字符串进行反序列化操作的复杂方法
# 反序列化
import json
with open('test.json', mode='rt', encoding='UTF-8') as f:
json_res = f.read()
l = json.loads(json_res)
print(l, type(l))
从文件读取json格式的字符串进行反序列化操作的简单方法
# 反序列化的简单方法
import json
with open('test.json', mode='rt', encoding='UTF-8') as f:
l = json.loads(f)
print(l, type(l))
json补充:
json验证:json格式兼容的是所有语言通用的数据类型,不能兼容某一语言特有的格式
import json
json.dumps({1, 2, 3, 4, 5}) # TypeError: Object of type set is not JSON serializable类型为set的对象不是JSON可序列化的
json强调:json格式没有单引号,只有双引号
import json
l = json.loads('[1, "aaa", true, false]')
print(l) # 输出:[1, 'aaa', True, False]
json了解:Python3.6之后:json自动encode和decode了
import json
with open('test.json',mode='rb') as f:
l=json.load(f)
print(l) # [1, 'aaa', True, False]
l1 = json.loads(b'[1, "aaa", true, false]')
print(l1, type(l1)) # 输出:[1, 'aaa', True, False]
res = json.dumps({'哈哈':'ahha'})
print(res, type(res))
l1 = json.loads('{"u54c8u54c8": "ahha"}')
l2 = json.loads(b'{"u54c8u54c8": "ahha"}')
print(l1)
print(l2)
猴子布丁
import json
import ujson
def monkey_patch_json():
json.__name__ = 'ujson'
json.dumps = ujson.dumps
json.loads = ujson.loads
monkey_patch_json() # 在入口处执行
# json.dumps = 其他的更好的dumps功能
# json.loads = 其他的更好的loads功能
json.dumps()
json.loads()
四:pickle模块
import pickle
dic = {'name': 'alvin', 'age': 23, 'sex': 'male'}
print(type(dic)) # <class 'dict'>
j = pickle.dumps(dic)
print(type(j)) # <class 'bytes'>
f = open('序列化对象_pickle', 'wb') # 注意是w是写入str,wb是写入bytes,j是'bytes'
f.write(j) # -------------------等价于pickle.dump(dic,f)
f.close()
# -------------------------反序列化
import pickle
f = open('序列化对象_pickle', 'rb')
data = pickle.loads(f.read()) # 等价于data=pickle.load(f)
print(data['age'])
import pickle
with open('a.pkl',mode='wb') as f:
# 一:在python3中执行的序列化操作如何兼容python2
# python2不支持protocol>2,默认python3中protocol=4
# 所以在python3中dump操作应该指定protocol=2
pickle.dump('你好啊',f,protocol=2)
with open('a.pkl', mode='rb') as f:
# 二:python2中反序列化才能正常使用
res=pickle.load(f)
print(res)
七 configparser模块
import configparser
config = configparser.ConfigParser()
config.read('test.ini')
import configparser
config = configparser.ConfigParser()
config.read('test.ini')
# 1.获取sections
print(config.sections()) # ['section1', 'section2']
# 2.获取某一sections下的所有的option
print(config.options('section1')) # ['k1', 'k2', 'user', 'age', 'is_admin', 'salary']
# 3.获取items
print(config.items('section1')) # [('k1', 'v1'), ('k2', 'v2'), ('user', 'egon'), ('age', '18'), ('is_admin', 'true'), ('salary', '31')]
# 4.获取某个section单独的元素值
res = config.get('section1', 'user')
print(res, type(res)) # egon <class 'str'>
res1 = config.getint('section1', 'age')
print(res1, type(res1)) # 18 <class 'int'>
res2 = config.getboolean('section1', 'is_admin')
print(res2, type(res2)) # True <class 'bool'>
res3 = config.getfloat('section1', 'salary')
print(res3, type(res3)) # 31.0 <class 'float'>
八 hashlib模块
一:什么是哈希hash
hash一类算法:该算法接收传入的内容,经过运算得到一串hash值
hash值的特点:
1.只要传入的内容一样,得到的hash值必然一样=====>要用明文传输密码文件完整性校验
2.不能由hash值返解成内容=======》把密码做成hash值,不应该在网络传输明文密码
3.只要使用的hash算法不变,无论校验的内容有多大,得到的hash值长度是固定的
二:hash的用途
用途1:特点2:用于密码密文传输与验证
用途2:特点1、3:用于文件完整性校验
123456asd ==> hash字符串
123456asd ==> md5 ==> hash字符串
客户端 ====> hash字符串 ====> 服务端
hash字符串
三:如何用hash
传的内容相同,hash值相同
import hashlib
m = hashlib.md5()
m.update('hello'.encode('UTF-8'))
m.update('world'.encode('UTF-8'))
res = m.hexdigest() # helloworld
print(res)
# fc5e038d38a57032085441e7fe7010b0
m1 = hashlib.md5()
m1.update('he'.encode('UTF-8'))
m1.update('llo'.encode('UTF-8'))
m1.update('wor'.encode('UTF-8'))
m1.update('ld'.encode('UTF-8'))
res = m1.hexdigest() # helloworld
print(res)
# fc5e038d38a57032085441e7fe7010b0
加文件内容的方式
m = hashlib.md5()
# 加内容方式1
m.update('文件所有的内容')
m.hexdigest()
# 加内容方式2(推荐)
m.update('hello'.encode('UTF-8'))
m.update('world'.encode('UTF-8'))
res = m.hexdigest() # helloworld
print(res)
m.update('文件所有的内容')
m.hexdigest()
f = open('a.txt', mode='rb')
f.seek()
f.read(2000)
模拟撞库:
import hashlib
cryptograph='aee949757a2e698417463d47acac93df'
passwds=[
'alex3714',
'alex1313',
'alex94139413',
'alex123456',
'123456alex',
'a123lex',
]
# 制作密码字典
dic = {}
for p in passwds:
res = hashlib.md5(p.encode('UTF-8'))
dic[p] = res.hexdigest()
# 模拟撞库得到密码
for k,v in dic.items():
if v == cryptograph:
print('撞库成功!明文密码是:%s' %k)
break
老师的撞库:
import hashlib
passwds=[
'alex3714',
'alex1313',
'alex94139413',
'alex123456',
'123456alex',
'a123lex',
]
def make_passwd_dic(passwds):
dic={}
for passwd in passwds:
m=hashlib.md5()
m.update(passwd.encode('utf-8'))
dic[passwd]=m.hexdigest()
return dic
def break_code(cryptograph,passwd_dic):
for k,v in passwd_dic.items():
if v == cryptograph:
print('密码是===>