day21 常用模块(一)

1. time模块

1.1 时间的格式

1) 时间戳(timestamp):

​ 从1970年到现在经过的秒数

作用:

​ 用于时间间隔的计算

print(time.time())#1585550344.012155

2) 按照某种格式显示的时间(format string):

作用 : 展示时间 2020-03-30 11:11:11

print(time.strftime('%Y-%m-%d %H:%M:%S %p'))
print(time.strftime('%Y-%m-%d %X'))
print(time.strftime('%Y-%m-%d %H %p'))

#2020-03-30 14:39:04 PM
#2020-03-30 14:39:04
#2020-03-30 14 PM

3) 结构化的时间(struct_time):

作用 : 用于单独获取时间的某一部分

res = time.localtime()
print(res)  
# time.struct_time(tm_year=2020, tm_mon=3, tm_mday=30, tm_hour=14, tm_min=41, tm_sec=27, tm_wday=0, tm_yday=90, tm_isdst=0)
print(res.tm_year)  	# 年:2020
print(res.tm_yday)  	# 今年的第90天
print(res.tm_hour)  	# 时:14
print(res.tm_min)  		# 分:41
print(res.tm_sec)  		# 秒:27
print(res.tm_mday)  	# 这个月的第30天
print(res.tm_mon)  		# 月:3
print(res.tm_wday)  	# 星期(0-6):0(星期一)
print(res.tm_zone)  	# 当前的时间区域

2. datetime模块

print(datetime.datetime.now())
print(datetime.datetime.now() + datetime.timedelta(days=3))
#计算3天后的时间
print(datetime.datetime.now() + datetime.timedelta(weeks=1))
#计算7天后的时间

3. 时间模块需要掌握的操作

3.1 时间格式的转换

struct_time->时间戳

import time
s_time=time.localtime()
print(s_time)
print(time.mktime(s_time))

时间戳->struct_time

tp_time=time.time()
print(time.localtime(tp_time))

世界标准时间与本地时间

print(time.localtime())# 上海时区(东八区)
print(time.gmtime()) # 世界标准时间,了解
print(time.localtime(333333333))
print(time.gmtime(333333333))

struct_time->格式化的字符串形式的时间

s_time=time.localtime()
print(time.strftime('%Y-%m-%d %H:%M:%S',s_time))
#2020-03-30 14:58:30
print(time.strftime('%Y-%m-%d %H:%M:%S'))
#2020-03-30 14:58:30
print(time.strptime('1988-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)

3.2 format string<------>timestamp

'1988-03-03 11:11:11'+7
# format string--->struct_time--->timestamp
struct_time=time.strptime('1988-03-03 11:11:11','%Y-%m-%d %H:%M:%S')
timestamp=time.mktime(struct_time)+7*86400
print(timestamp)#573966671.0

# format string<---struct_time<---timestamp
res=time.strftime('%Y-%m-%d %X',time.localtime(timestamp))
print(res)#1988-03-10 11:11:11

了解知识:

import time
print(time.asctime())# Mon Mar 30 15:03:54 常用于Linux操作系统

import datetime
print(datetime.datetime.now())
print(datetime.datetime.fromtimestamp(333333))
# 时间戳直接转成日期格式 1970-01-05 04:35:33

4. random模块

4.1 常用命令

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.sample([111, 'aaa', 'ccc','ddd'],3))#任意三个组合

print(random.uniform(1, 3)) 
# 大于1小于3的小数,如1.927109612082716

item = [1, 3, 5, 7, 9]
random.shuffle(item)  # 打乱item的顺序,相当于"洗牌"
print(item)

4.2 应用案例:随机验证码

import random
#随机生成4位大写字母+数字的验证码
def make_code(size=4):
    res=''
    for i in range(size):
        s1=chr(random.randint(65,90))#从26大写字母中随机取出一个
        s2=str(random.randint(0,9))#从10个数字中随机取出一个
        res+=random.choice([s1,s2])#随机取出一个,加到res中
    return res
print(make_code(6))

ps:
    小写字母则加入:s2 = chr(random.randint(97,122))

5. os模块

5.1 常用命令

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的大小

5.2 常用命令解析

os.listdir() 获取某一个文件夹下的子文件和文件名

# 获取某一个文件夹下所有的子文件以及子文件夹的名字
res=os.listdir('../../week4')
['day16', 'day17', 'day18', 'day19', 'day20']
res=os.listdir('.')
#['01 时间模块.py', '02 random模块.py', '03 os模块.py', '04 sys模块.py', 'day21 笔记.md', 'run.py', '作业(3).txt', '笔记.txt']
print(res)

os.path.getsize() 查看文件大小

size=os.path.getsize(r'作业(3).txt')#218
print(size)

os.remove()  #删除一个文件
os.rename("作业(3).txt","作业.txt")  #重命名文件/目录

print(os.listdir('.'))
['01 时间模块.py', '02 random模块.py', '03 os模块.py', '04 sys模块.py', 'day21 笔记.md', 'run.py', '作业.txt', '笔记.txt']

os.environ 获取系统环境变量

# 规定:key与value必须都为字符串

os.environ['aaaaaaaaaa']='111'
print(os.environ)

文件相关操作

print(__file__)
#E:/python学习/week5/day21/03 os模块.py
print(os.path.abspath(__file__)) #返回path规范化的绝对路径
#E:\老男孩\python学习\week5\day21\03 os模块.py

print(os.path.dirname(r'/a/b/c/d.txt'))#路径的文件夹
print(os.path.basename(r'/a/b/c/d.txt'))#路径的文件名
#/a/b/c
#d.txt
print(os.path.split('/a/b/c/d.txt'))        
# 会把路径和文件切分开:('/a/b/c', 'd.txt')
print(os.path.split(__file__))              
# 会把路径和文件切分开:('E:/python学习/week5/day21', '03 os模块.py')

print(os.path.isabs(r'../week5'))    # 判断是否为绝对路径

print(os.path.isfile(r'笔记.txt'))
print(os.path.isfile(r'aaa'))
print(os.path.isdir(r'aaa'))
#True
#False
#True
print(os.path.join('a','s','b','c','d'))#文件拼接
print(os.path.join('a','/','b','c','d'))
print(os.path.join('a','C:','b','c','d'))
#a\s\b\c\d
#/b\c\d
#C: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)#\a\b\c\d\e.txt

print(res.resolve())# 格式规范化,把 / 变成 \:E:\a\b\c\d\e.txt

6. sys模块

6.1 常用命令

import sys
sys.argv           #命令行参数List,第一个元素是程序本身路径
sys.exit(n)        #退出程序,正常退出时exit(0)
sys.version        #获取Python解释程序的版本信息
sys.maxint         #最大的Int值
sys.path           #返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
sys.platform       #返回操作系统平台名称

6.2 常用命令解析

sys.argv 命令行参数List,第一个元素是程序本身路径

# python3.8 run.py 1 2 3
# sys.argv获取的是解释器后参数值
print(sys.argv)
#['E:/python学习/week5/day21/run.py']

文件拷贝的原始方法

src_file = input('原文件路径:').strip()
dst_file = input('新文件路径:').strip()

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)

文件拷贝的新方法

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)
# 在run.py所在的文件夹下,按住shift,右键,选择“在此处打开power shell”,输入
# 格式:python3 run.py 原文件路径 新文件路径
# python3 run.py D:\1.docx D:\2.docx   #拷贝成功

6.3 应用:进度条

#基础知识
# print('[%-50s]' %'#')
# print('[%-50s]' % '##')
# print('[%-50s]' % '###')

# 输出:
[#                                                 ]
[##                                                ]
[###                                               ]
import time
#进度条显示
res = ''
for i in range(50):
    res += '#'
    time.sleep(0.2)
    print('\r [%-50s]' % res, end='')
    
# 输出:  [##################################################]
    
#进阶
import time
recv_size = 0
total_size = 25600

while recv_size < total_size:
    # 模拟网速
    time.sleep(0.2)
    # 下载了1024个字节的数据
    recv_size += 1024
    # 打印进度条
    # print(recv_size)
    percent = recv_size / total_size    # 1024 / 25600
    if percent > 1:
        percent = 1
    res = int(50 * percent) * '>'
    print('\r [%-50s] %d%%' % (res,percent*100), end='')
    
#函数最终版
import time

def progress(percent):
    if percent > 1:
        percent = 1
    res = int(50 * percent) * '>'
    print('\r [%-50s] %d%%' % (res,percent*100), end='')

recv_size = 0
total_size = 25600

while recv_size < total_size:
    time.sleep(0.2)
    recv_size += 1024
    percent = recv_size / total_size    # 1024 / 25600
    progress(percent)

7. shutil模块

​ 高级的 文件、文件夹、压缩包 处理模块

7.1 基本使用

import shutil
shutil.copyfile( src, dst)   #从源src复制到dst中去。 如果当前的dst已存在的话就会被覆盖掉

shutil.move( src, dst)  #移动文件或重命名

shutil.copymode( src, dst) #只是会复制其权限其他的东西是不会被复制的

shutil.copystat( src, dst) #复制权限、最后访问时间、最后修改时间

shutil.copy( src, dst)  #复制一个文件到一个文件或一个目录

shutil.copy2( src, dst)  #在copy上的基础上再复制文件最后访问时间与修改时间也复制过来了,类似于cp –p的东西

shutil.copy2( src, dst)  #如果两个位置的文件系统是一样的话相当于是rename操作,只是改名;如果是不在相同的文件系统的话就是做move操作

shutil.copytree( olddir, newdir, True/Flase) #把olddir拷贝一份newdir,如果第3个参数是True,则复制目录时将保持文件夹下的符号连接,如果第3个参数是False,则将在复制的目录下生成物理副本来替代符号连接

shutil.rmtree( src )   #递归删除一个目录以及目录内的所有内容

7.2 高级使用

shutil.copyfileobj(fsrc, fdst[, length])
将文件内容拷贝到另一个文件中

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) 拷贝文件和权限

shutil.copy('f1.log', 'f2.log')

shutil.copy2(src, dst) 拷贝文件和状态信息

shutil.copy2('f1.log', 'f2.log')

shutil.ignore_patterns(*patterns)
shutil.copytree(src, dst, symlinks=False, ignore=None)
递归的去拷贝文件夹

shutil.copytree('folder1', 'folder2', ignore=shutil.ignore_patterns('*.pyc', 'tmp*')) 
#目标目录不能存在,注意对folder2目录父级目录要有可写权限,ignore的意思是排除 
shutil.copytree('f1', 'f2', symlinks=True, ignore=shutil.ignore_patterns('*.pyc', 'tmp*'))

'''
通常的拷贝都把软连接拷贝成硬链接,即对待软连接来说,创建新的文件
'''

shutil.rmtree(path[, ignore_errors[, onerror]]) 递归的去删除文件

shutil.rmtree('folder1')

shutil.move(src, dst) 递归的去移动文件,它类似mv命令,其实就是重命名。

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 两个模块来进行的,详细:

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压缩解压缩

猜你喜欢

转载自www.cnblogs.com/Henry121/p/12599315.html