python 常用模块
一 time
time 模块是普通的时间模块
1、time.time( )
时间戳:从 1970 到现在经过的秒数
作用:用于时间间隔的计算
import time
print(time.time()) #1585531035.687209
2、time.strftime( )
按照某种格式显示的时间: 2020-03-30 11:11:11
作用:用于展示时间
print(time.strftime('%Y-%m-%d %H:%M:%S')) #2020-04-04 19:40:28
print(time.srtftime('%Y-%m-%d %X')) #2020-03-30 09:18:39
#获取当前的年
print(time.strftime('%Y')) #2020
3、time.localtime()
结构化时间
作用: 用于获取时间的某一部分
res = time.localtime()
print(res)#time.struct_time(tm_year=2020, tm_mon=3, tm_mday=30, tm_hour=9, tm_min=19, tm_sec=49, tm_wday=0, tm_yday=90, tm_isdst=0)
print(res.tm_year) #2020
print(res.tm_yday) #90
补充:
世界标准时间(结构化)与本地之间(东八区)对比
print(time.localtime()) #time.struct_time(tm_year=2020, tm_mon=3, tm_mday=30, tm_hour=15, tm_min=21, tm_sec=44, tm_wday=0, tm_yday=90, tm_isdst=0)
print(time.gmtime()) #time.struct_time(tm_year=2020, tm_mon=3, tm_mday=30, tm_hour=7, tm_min=20, tm_sec=39, tm_wday=0, tm_yday=90, tm_isdst=0)
#本地址时间(采用上海时间)比世界标准时间快了 8 个小时
时间显示格式为:星期 月份 天数 时间 年(通常用于 linux 系统)
import time
print(time.asctime()) #Mon Mar 30 15:46:23 2020
4、时间转换
![image-20200404195458208](https://tva1.sinaimg.cn/large/00831rSTgy1gdhzd1zfylj30s40kemzd.jpg)
示例:
结构化时间 --------------》时间戳
import time
s_time= time.localtime()
print(time.mktime(s_time)) #1585552579.0
时间戳--------------》结构化时间
tp_time = time.time()
print(time.localtime(tp_time)) #time.struct_time(tm_year=2020, tm_mon=3, tm_mday=30, tm_hour=15, tm_min=25, tm_sec=15, tm_wday=0, tm_yday=90, tm_isdst=0)
print(time.localtime(333333333)) #time.struct_time(tm_year=1980, tm_mon=7, tm_mday=25, tm_hour=8, tm_min=35, tm_sec=33, tm_wday=4, tm_yday=207, tm_isdst=0)
结构化时间--------------》格式化的字符串形式的时间
s_time= time.local()
print(time.strftime('%Y-%m-%d %H:%M:%S', s_time)) #2020-03-30 15:29:04
#获取年月
print(time.strftime('%Y/%m')) #2020/03
# 获取年月日
print(time.strftime('%Y-%m-%d')) #2020-03-30
格式化字符串时间转换为------------》结构化时间
print(time.strptime('19888-03-03 11:11:11', '%Y-%m-%d, %H:%M:%S'))
#time.struct_time(tm_year=1988, tm_mon=3, tm_mday=3, tm_hour=11, tm_min=11, tm_sec=11, tm_wday=3, tm_yday=63, tm_isdst=-1)
必须掌握:format string(格式化时间) <---------->timestamp(时间戳)
格式化时间与时间戳格式不能直接互相转化,需要通过结构化时间
格式化时间 ----------》结构化时间-----------------》时间戳
'''
'1988-03-03 11:11:11'+7
'''
struct_time = time.strptime('1988-03-03 11:11:11', '%Y-%m-%d, %H:%M%s') #格式化时间转换为结构化时间
timestamp = time.mktime(struct_time) +7 * 86400 #结构化时间转换为时间戳 +7
print(timestramp) #573966671.0
时间戳 --------------》结构化时间--------------------》格式化时间
timestamp = time.time() #时间戳
struct_time = time.localtime(timestamp) #时间戳转换为结构时间
res = time.strftime('%Y-%m-%d, %X', struct_time) #2020-03-30 15:42:39
二 datetime
datetime 模块是基于 time 模块封装的一种比较便利的时间模块
1、获取当前时间
import datetime
print(datetime.datetime.now()) #2020-03-30 15:48:20.298178
#世界时间
print(datetime.datetime.utcnow()) #2020-03-30 07:48:20.298234
# 获取当前年月日
print(datetime.date.today() #2020-03-31
# 获取当前年月日时分秒
print(datetime.datetime.today()) #2020-03-31 00:39:08.038798
2、时间加减计算
日期/时间的计算:
日期时间 = 日期时间 “+” or “-” 时间对象
时间对象 = 日期时间 “+” or “-” 日期时间
print(datetime.datetime.now()) #2020-03-30 09:59:59.554466
#获取三天后的时间
print(datetime.datetime.now() + datetime.timedelta(days=3)) #2020-04-02 09:59:59.554513
#获取一周后的时间
print(datetime.datetime.now() + datetime.timedelta(weeks=1))#2020-04-06 09:59:59.554529
3、时间格式转换
时间戳转换为格式化时间
import datetime
pirint(datetime.datetime.fromtimestamp(333333)) #1970-01-05 04:35:33
时间替换
c_time = datetime.datetime.now()
print(c_time)
print(c_time.replace(minute=3, hour=2)) #时间替换
#结果展示
'''
2020-03-31 00:23:27.756616
2020-03-31 02:03:27.756616
'''
三 random
random:python提供的随机取值模块
1 random.random( ) #(0,1)
取大于 0 且小于 1 之间的小数
import random
res = random.random()
#print(res) #0.0013748341683205156
print(res) #0.2427640714095196
2 random.randint(1, 3 ) #[1, 3]
取大于等于 1 且小于等于 3 之间的整数
res = random.randint(1, 3)
#print(res) #2
#print(res) #3
print(res) #1
3 random.randrange(1, 3) #[1, 3)
取大于等于1且小于 3 之间的整数
res = random.randrange(1, 3)
print(res) #1
print(res) #2
4 random.choice([111, 'aaa', [4,5]])
取列表中的一个元素: 1或者23或者[4,5]
res= random.choice([111, 'aaa', [4, 5]]) # 1或者23或者[4,5]
print(res) #[4,5]
5 random.sample([111,'aaa','bbb', [4,5]])
取列表中两个元素任意组合成列表
res = random.sample([111, 'aaa', 'bbb', [4, 5]])
#print(res) # ['aaa', 111]
print(res) #[111, 'bbb']
6 random.uniform(1, 3) #(1, 3)
取大于 1 小于 3 的小数
res = random.uniform(1, 3)
print(res) #2.913178536016434
7 random.shuffle( 可迭代对象)
打乱可迭代对象中的元素,相当于'洗牌'
item = [1,3,5,7,9]
res = random.shuffle(item)
print(res) #[7, 3, 5, 9, 1]
应用:随机验证码
随机验证码是由字母和数字组成
字母范围(A-Z) :随机生成字母:通过随机 ASCII 码数字,然后转换为字母
数字(0-9)
伪代码:
import random
res = ''
for i in range(6):
从 26 个大写字母中随机取出一个 = chr(random.randint(65, 90))
从 10 个数字中随机取出一个 = str(random.randint(0, 9))
随机字符 = ransdom.choice([从26大写字母中随机取出一个,从10个数字中随机取出一个])
res += 随机字符
示例:
import random
def make_code(size_num):
'''
验证功能
size_num:验证码字符个数
'''
str1 = '' #验证码
for i in range(size_num):
#大写字母
str_upper = chr(random.randint(65, 90)) # A-Z
#小写字母
str_lower = chr(random.randint(97, 122)) # a-z
#数字
num = str(random.randint(0, 9)) #0-9
res = random.choice((str_lower, str_upper, num))
str1 += res
return str1
res = make_code(6)
注:在ASCII码中,数字范围:97-122,对应小写字母;数字范围65-90,对应大写字母。
三 os
os 模块是与操作系统交互的一个接口
1、os.listdir('文件夹路径') 或 os.listdir('.')
获取某 一个文件夹下所有的子文件以及子文件夹的名字
res = os.list('.')
print(res) #['笔记.txt', '01 时间模块.py', 'run.py', '04 sys模块.py', '02 random模块.py', 'aaa', '03 os模块.py']
2、os.path.getsize('文件路径')
获取文件大小(单位:字节)
print(__file__) #/Users/tophan/Desktop/代码 2/03 os模块.py
size = os.path.getsize(__file__)
print(size) #187 字节
3、os.remove( )
删除一个文件
4、os.rename('oldname', 'newname')
重命名文件/目录
5、os.system('cmd 命令 ')
应用程序向操作系统发送 'cmd命令'请求 ,返回值是字符
因为返回值是字符,所以就会涉及字符编码问题
#查看根目录下的文件目录 应用程序-----》'ls /'
os.system('ls /') #运行 shell 命令 直接显示
6、os.environ
获取系统环境变量,应用软件级别的变量
#添加系统环境变量, 规定:key, value必须都为字符串类型
os.environ['aaaaaaaaaa']='111'
print(os.environ) #{字典类型}
7、os.path
1、返回文件路径中的目录(即文件所在的文件夹)
print(os.path.dirname(r'/a/b/c/d.txt')) #/a/b/c
2、返回文件路径中的文件名
print(os.path.basename(r'/a/b/c/d.txt')) #d.txt
3、判断文件是否存在
前提:与执行文件是同一级别
如果path 存在,返回 True,否则返回 False
print(os.path.isfile(r'笔记.txt')) #False 没有这个文件
print(os.path.isfile(r'os 模块.py')) #True 文件有
print(os.path.isfile(r'day22')) #False day22为文件夹
print(os.path.isfile(r'格式化输出.py')) #False #不是同一目录下
4、判断文件夹是否存在
前提:与执行文件是同一级别
如果文件存在,返回 True,否则返回 False
print(os.path.isdir(r'aaa')) #False #文件夹不存在
print(os.path.isdir('day22')) #False #不是同一级别
print(os.path.isdir('111')) #True
5、os.path.join( )
拼接路径
print(os.path.join(r'/a/b', 'c.txt')) #/a/b/c.txt
print(os.path.join('a','/','b','c','d')) #/b/c/d #拼接路径,根目录(/)忽略
6、os.dir.dirname(__ file __)
获取执行文件的上一级目录
BASE_DIR = os.path.dirname(os.path.dirname(__file__))
print(BASE_DIR) #/Users/tophan/2020_python
os.path.normpath(文件) :
按..或/ 的数目返回上一级目录
res = os.path.join(
__file__,
'..', ##.. 代表上一级
'..' #.. 代表上一级
)
#规范化路径,如..和/
print(res) #/Users/tophan/2020_python/day22/os 模块.py/../..
BASE_DIR=os.path.normpath(res) #按..或/ 的数目返回上一级目录
print(BASE_DIR) #/Users/tophan/2020_python
了解:
在Linux和Mac平台上,该函数会原样返回path,在windows平台上会将路径中所有字符转换为小写,并将所有斜杠转换为饭斜杠。
>>> os.path.normcase('c:/windows\\system32\\')
'c:\\windows\\system32\\'
7 os 用法具体案例
#项目的根目录、路径相关的值都用'常量'
BASE_PATH = os.path.dirname(DAY15_PATH)
print(BASE_PATH) #/Users/tophan/python练习
# 路径的拼接:拼接文件'绝对路径'
TEST_PATH = os.path.join(DAY15_PATH, '火影写真.txt')
print(TEST_PATH) #/Users/tophan/python练习/day15/老男孩教师写真.txt
# 判断'文件/文件夹'是否存在:若文件存在返回True,若不存在返回False
print(os.path.exists(TEST_PATH))# True
print(os.path.exists(DAY15_PATH)) # True
#判断'文件夹'是否存在
print(os.path.isdir(TEST_PATH)) #这里是文件,所以False
print(os.path.isdir(DAY15_PATH))#这里是文件夹,所以True
#创建文件夹
DIR_PATH = os.path.join(DAY15_PATH, '火影写真集')
os.mkdir(DIR_PATH)
#删除文件夹:只能删除'空的文件夹'
DIR_PATH = os.path.join(DAY15_PATH, '火影写真集')
os.rmdir(DIR_PATH)
#获取某个文件夹中所有文件的名字
DAY_PATH = '/Users/tophan/2020_python'
list1 = os.listdir(DAY_PATH)
print(list1) #拿到文件夹下所有文件或文件夹(只一层)
res = enumerate(list1) # <enumerate object at 0x10de27b40> enumerate(可迭代对象)---->得到一个对像,对象有一个个的元组(索引,元素)
print(list(res)) #得到列表套元组类型 [(0, 'day07'), (1, 'day09'), (2, 're.txt'), (3, 'day08'), (4, '火影写真集'), (5, '11.py'), (6, '深浅拷贝.py')...]
#可以通过列表索引方式拿到元组,再通过元组索引拿到对应文件或文件夹名
print(list(res)[1][1]) #day09
8 os常用方法大全
os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径
os.chdir("dirname") 改变当前脚本工作目录;相当于shell下cd
os.curdir 返回当前目录: ('.')
os.pardir 获取当前目录的父目录字符串名:('..')
os.makedirs('dirname1/dirname2') 可生成多层递归目录
os.removedirs('dirname1') 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推
os.mkdir('dirname') 生成单级目录;相当于shell中mkdir dirname
os.rmdir('dirname') 删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname
os.listdir('dirname') 列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印
os.remove() 删除一个文件
os.rename("oldname","newname") 重命名文件/目录
os.stat('path/filename') 获取文件/目录信息
os.sep 输出操作系统特定的路径分隔符,win下为"\\",Linux下为"/"
os.linesep 输出当前平台使用的行终止符,win下为"\t\n",Linux下为"\n"
os.pathsep 输出用于分割文件路径的字符串 win下为;,Linux下为:
os.name 输出字符串指示当前使用平台。win->'nt'; Linux->'posix'
os.system("bash command") 运行shell命令,直接显示
os.environ 获取系统环境变量
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的大小
8、pathlib
pathlib:在 python3.5之后推出的一个新的模块
from pathlib import Path
# print(Path(__file__)) #/Users/tophan/2020_python/day22/os 模块.py
res = Path(__file__).parent.parent #返回值是执行文件的上一级的上一级路径
print(res) #/Users/tophan/2020_python
Path('文件目录' / '文件名'):拼接文件路径
res=Path('/a/b/c') / 'd/e.txt' #拼接文件路径
print(res) #/a/b/c/d/e.txt
path.resolve() 方法会把一个路径或路径片段的序列解析为一个绝对路径
res=Path('/a/b/c') / 'd/e.txt'
print(res.resolve()) #把一个路径或路的序列解析为一个绝对路径
四 sys 模块
1 sys 模块
sys模块是与 python 解释器交互的模块
import sys
import os
# 获取当前的Python解释器的环境变量路径
print(sys.path)
# 将当前项目路径添加到环境变量中
BASE_PATH = os.path.dirname(os.path.dirname(__file__))
sys.path.append(BASE_PATH)
# 获取cmd终端的命令行 python3 py文件 用户名 密码
print(sys.argv) # 返回的是列表['']
2 sys.argv
sys.argvs :相当于一个程序从外部接收参数的桥梁;它可以看做一个列表,列表内是外部输入的参数。其第一个元素是执行程序本身,后面才是外部给予的参数
应用场景:一般应用于使用终端执行 python 程序
#当在终端中执行python 文件时,通过sys.argv #获取的是解释器后参数值 ['run.py', 'a.txt', 'b.txt']
#通过sys.argv 可以获取的是解释器后参数值 ['run.py', 'a.txt', 'b.txt']
print(sys.argv) # 通过打印操作,终端可以打印出['run.py', 'a.txt', 'b.txt']
具体案例1:
1、检索文件夹大小的程序,要求执行方式如下 :python3.8 run.py 文件夹
'''
c.txt
hahaha
hahaha
hahaha
'''
'''sys.argv应用.py'''
import sys
import os
res = sys.argv[1]
if os.path.exists(res):
size = os.path.getsize(res)
print(f'文件大小为{size}') #文件大小为21
'''run.py''' #执行文件
import os
#os.system('终端命令'):python向操作系统发送请求, 让操作系统执行终端命令
os.system('python3 /Users/tophan/2020_python/day22/sys.argv应用.py /Users/tophan/2020_python/day22/c.txt')
具体案例2:
通过 终端命令进行拷贝文本
import sys
#sys.argv:获取的是解释器后参数值
print(sys.argv) # 有这步打印操作,终端中才会显示['run.py', 'a.txt', 'b.txt']
src_file = sys.argv[1] #a.txt, 源文件路径
dst_file = sys.argv[2] #b.txt, 目标文件路径
with open('%s'%src_file, 'rb')as read_f,\
open('%s'%dst_file, 'wb')as write_f:
for line in read_f:
write_f.write(line)
进度条案例
具备知识:
print('[%-50s]' %'#') #[# ]
print('[%-50s]' %'##') #[## ]
print('[%-50s]' %'###') #[### ]
'''
指定列表宽度:50
- :右对齐
'#':打印#,不够就用空格填充
'''
示例:
res = ''
import time
for i in range(50):
res += '#'
time.sleep(0.3)
print('\r[%-50s]%d'%(res, i+1), end='') #\r:移至行首,即每次循环打印不会再在后面接着打印,都是会跳到行首打印,因此每次都会覆盖掉原来的打印内容,肉眼看起来像动态的进度
结果展示:
[############################################ ]44
[##################################################]50
进度条具体代码:
import time
def progress(percent):
res_str = '#' * int(percent * 50)
time.sleep(0.01)
#\r:移至行首
print('\r[%- 50s] %d%%' % (res_str, int(100 * percent)), end='')
total_size = 333333
recv_size = 0
while recv_size < total_size:
# 未接收字的节数
remaining_size = total_size - recv_size
if remaining_size >= 1024:
# 每次接收的字节数
recv_size += 1024
# 获取接收的数据占总数据多少百分比
else:
recv_size += remaining_size
percent = recv_size / total_size
progress(percent)
五 shutil 模块
高级的 文件、文件夹、压缩包 处理模块
1 shutil.copyfileobj(fsrc, fdst, length)
将文件内容拷贝到另一个文件中
import shutil
shutil.copyfileobj(open('old.xml','r'), open('new.xml', 'w'))
2 shutil.copyfile(src, dst)
拷贝文件
shutil.copyfile('f1.log', 'f2.log') #目标文件无需存在
3 shutil.copymode(src, dst)
仅拷贝权限。内容、组、用户均不变
shutil.copymode('f1.log', 'f2.log') #目标文件必须存在
4 shutil.copystat(src, dst)
仅拷贝状态的信息,包括:mode bits, atime, mtime, flags
shutil.copystat('f1.log', 'f2.log') #目标文件必须存在
5 shutil.copy(src, dst)
拷贝文件和权限
import shutil
shutil.copy('f1.log', 'f2.log')
6 shutil.copy2(src, dst)
拷贝文件和状态信息
import shutil
shutil.copy2('f1.log', 'f2.log')
7 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的意思是排除
8 shutil.rmtree(path[, ignore_errors[, onerror]])
递归的去删除文件
import shutil
shutil.rmtree('folder1')
9 shutil.move(src, dst)
递归的去移动文件,它类似mv命令,其实就是重命名。
import shutil
shutil.move('folder1', 'folder3')
10 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 两个模块来进行的,详细:
import zipfile
# 压缩
z = zipfile.ZipFile('laxi.zip', 'w')
z.write('a.log')
z.write('data.data')
z.close()
# 解压
z = zipfile.ZipFile('laxi.zip', 'r')
z.extractall(path='.')
z.close()
#zipfile压缩解压缩
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()
tarfile压缩解压缩