24、sys、shutil模块与进度条

Python模块 / 2020-12-10

6、sys模块

顾名思义,也是跟系统有关!

6.1、接收外界参数

在shell脚本中,我们可以手动传递参数给脚本,脚本接收后以$来接收,第一个即$1!sys.argv也可以做到,它把接收到的值以列表形式存放在内存中,第一个值是文件路径,第二个开始是用户传递的参数!

import sys

argv = sys.argv
print('hello,', argv[1])
print('hello,', argv[2])

# 命令行执行
(venv) C:\Users\AERO\PycharmProjects\pythonProject1>python test.py sanxi chrystal
hello, sanxi
hello, chrystal

sys.path模块在Python模块基础中已提到,不再赘述!

6.2、退出程序

跟函数中用return,循环中用break道理一样,exit是直接退出当前程序的运行,括号里面可以自定义退出码,默认为0!

argv = sys.argv
print('hello,', argv[1])
sys.exit()
print('hello,', argv[2])

# 命令行窗口执行,可以看到后面的print已经没机会执行了!
(venv) C:\Users\AERO\PycharmProjects\pythonProject1>python test.py sanxi chrystal
hello, sanxi
6.3、显示系统名称
# 我这个是Ubuntu20.0.4
>>> sys.platform
'linux'
# 这个是Windows 10
>>> sys.platform
'win32'
6.4、显示解释器版本
>>> sys.version
'3.8.3 (tags/v3.8.3:6f8c832, May 13 2020, 22:20:19) [MSC v.1925 32 bit (Intel)]'
6.5、python最大整数
>>> sys.maxsize
9223372036854775807

7、进度条

一般Linux上进度条都是用#,有时候还会在右边显示进度的百分比,下面我们就一步一步实现!

#-是左对齐,20是宽度,%s接受外面的参数#
print('[%-20s]' %'#')
print('[%-20s]' %'##')

# 执行得到结果
[#                   ]
[##                  ]

来搞个模拟下载进度条与百分比

import time


def progress(percent, width=20, symbol='#'):
     if percent > 1:
        percent = 1
     symbol_number = ('[%%-%ds]' % width) % (int(percent * width) * symbol)  # 按照百分比打印N个#并左对齐
     # end表示遇到空格后结束,\r是光标始终处于行首两者配合以达到不断覆盖显示的效果,%d仅接受int,.2f表示精确到小数点后几位
     print('\r%s, %.2f%%' % (symbol_number, percent * 100), end='')


def download_func(size):
    total_size = size
    download_size = 0
    while download_size < total_size:
        time.sleep(0.2)  # 模拟下载延迟
        download_size += 1024  # 下载速度
        percent = download_size / total_size  # 百分比
        progress(percent)  # 调用进度条

download_func(102400)

8、文件处理模块shutil

8.1、拷贝文件内容

第一个open为源文件,第二个为目标文件;目标文件必须事先存在!类似Linux上 cat main.py > haha.py

shutil.copyfileobj(open(r'main.py', 'rb'), open(r'haha.py', 'wb'))
8.2、真·拷贝文件

目标文件不需要事先存在,类似Linux上cp main.py haha.py,区别是这个没有把拷贝源文件的权限也拷贝过去

shutil.copyfile('main.py', 'haha.py')
8.3、拷贝文件权限

先看看原始权限,注意:目标文件必须事先存在

ubuntu@VM-0-8-ubuntu:~$ ls -l
total 52
-rw-rw-r-- 1 ubuntu ubuntu 17206 Oct 20 10:38 seafile-server-7.1-ubuntu-amd64-http
-rw-rw---x 1 ubuntu ubuntu 30174 Oct 20 10:30 v2ray.sh

改完后可以看到,另一个文件v2ray一样拥有执行权限x了

>>> shutil.copymode('v2ray.sh','seafile-server-7.1-ubuntu-amd64-http')
>>> 
ubuntu@VM-0-8-ubuntu:~$ ls -l
total 52
-rw-rw---x 1 ubuntu ubuntu 17206 Oct 20 10:38 seafile-server-7.1-ubuntu-amd64-http
-rw-rw---x 1 ubuntu ubuntu 30174 Oct 20 10:30 v2ray.sh
8.4、拷贝文件及权限
>>> import shutil
>>> shutil.copy('v2ray.sh', 'test.sh')
'test.sh'  # 返回值是目标文件名
ubuntu@VM-0-8-ubuntu:~$ ls  # 确认结果
test.sh  v2ray.sh
8.5、递归拷贝

目标目录事先不能存在;必须对目标目录的上级目录有可写权限;ignore是忽略的意思,我忽略了lib目录

shutil.copytree('venv', 'new_lib', ignore=shutil.ignore_patterns('lib'))  # 类似Linux的cp -r
8.6、递归删除
shutil.rmtree('new_lib')  # 类似于Linux上rm -rf,也可以跟上面一样用ignore排除!
8.7、递归移动
shutil.move('haha.py', 'hihi.py')  # 跟Linux的mv一样,其实就是个重命名
8.8、压缩文件/目录

第一个参数是目标路径,第二是压缩格式,第三是源目录/文件

shutil.make_archive('E:/Note/venv', 'gztar', root_dir='venv')

实际效果,压缩成功!

image20201210163412884.png

世间微尘里 独爱茶酒中