python之 sys、os、subprocess、shutil 模块
一、sys模块
system的缩写,提供对Python 解释器本身的访问和控制(比如参数、路径、退出)
1、sys.argv 列表
在Python中,sys.argv是一个列表,它包含了命令行参数传递给Python脚本的参数值。
sys.argv是一个列表,保存了 命令行传入脚本的所有参数 。sys.argv[0]是脚本本身的文件名(可能带有路径)。sys.argv[1:]表示从第 2 个参数开始到结尾的所有参数(即 用户自定义参数 )。
import sys
# 打印脚本名称
print("脚本名称:", sys.argv[0])
# 打印传递给脚本的参数值
print("参数值:", sys.argv[1:])
# 检查是否传递了足够的参数
if len(sys.argv) < 2:
print("请提供至少一个参数")
sys.exit(1)
# 使用传递给脚本的参数进行操作
for arg in sys.argv[1:]:
print("处理参数:", arg)
# 在这里执行你的操作
补充:sys.argv[0] 带有路径:
执行脚本用的是绝对路径,第一个参数 0 就显示路径+脚本名称
相对路径,则只有脚本名
# python /healsci/scripts/test.py --db-type=mysql --db-host=192.168.1.205 ['/healsci/scripts/test.py', '--db-type=mysql', '--db-host=192.168.1.205'] # python test.py --db-type=mysql --db-host=192.168.1.205 ['test.py', '--db-type=mysql', '--db-host=192.168.1.205']
2、常用操作
import sys
# 1. 获取命令行参数
print(sys.argv) # ['script.py', 'arg1', 'arg2']
# 2. 获取或修改 Python 路径(模块搜索路径)
print(sys.path)
sys.path.append('/my/custom/path')
# 3. 获取 Python 版本信息
print(sys.version)
# 4. 获取平台信息
print(sys.platform) # 如 'win32', 'linux', 'darwin'
# 5. 终止程序
sys.exit(0) # 正常退出
# 6. 标准输入输出流
sys.stdout.write("Hello\n")
sys.stdin.readline()
二、os 模块
operating system的缩写,提供对操作系统功能的接口(如文件、目录、进程等)
1、目录、文件的创建与删除
创建多层递归目录
os.makedirs('day24/day25')
生成单级目录;相当于shell中mkdir dirname
os.mkdir('aa')
递归删除空目录
os.removedirs('dirname1')
删除单级空目录,若目录不为空则无法删除
os.rmdir('dirname')
os.listdir
列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印
res = os.listdir('/Users/sanpangdan/Desktop/python_fullstack')
print(res)
['file.txt', '简易登录注册系统.py', '第二周作业:多用户注册登录.py', '随机抽人.py', 'day10.txt', 'Md.xlsx', '.DS_Store', '.pytest_cache', 'day11.py', 'zhuce.py', 'zm.txt', '周测三代码 1.py', 'day14.py', 'day23', '图片复制功能.py', '__pycache__', '用户认证装饰器 .py', '函数版员工管理系统', '红牛数据写入excel文件中', '10018.jpg', 'lianxi.py', '软件开发规范-员工管理系统', 'day13.py', '周测三.py', 'count_times.txt', 'a.txt', 'day12.py', '员工管理系统(函数版).py', 'icai.txt', 'day16.py', '带参装饰器.py', '装饰器作业 3.py', 'day19.py', '第二周作业.py', 'day18.py', 'day21', 'sample.txt', '.idea']
删除一个文件
os.remove('a.txt')
shutil模块
shutil.rmtree
删除指定目录文件夹下所有内容
import os
import shutil
def delete_directory(path):
shutil.rmtree(path)
# 使用示例
directory_path = '/Users/sanpangdan/Desktop/python_fullstack/test'
delete_directory(directory_path)
重命名文件/目录
os.rename("oldname","newname")
2、获取文件/目录信息
os.stat
res = os.stat('/Users/sanpangdan/Desktop/python_fullstack/day16.py')
print(res)
os.stat_result(st_mode=33188, st_ino=17327596, st_dev=16777229, st_nlink=1, st_uid=501, st_gid=20, st_size=140, st_atime=1686377085, st_mtime=1686377084, st_ctime=1686377084)
os.stat('path/filename') 获取文件/目录信息 的结构说明
stat 结构: st_mode: inode 保护模式 st_ino: inode 节点号。 st_dev: inode 驻留的设备。 st_nlink: inode 的链接数。 st_uid: 所有者的用户ID。 st_gid: 所有者的组ID。 st_size: 普通文件以字节为单位的大小;包含等待某些特殊文件的数据。 st_atime: 上次访问的时间。 st_mtime: 最后一次修改的时间。 st_ctime: 由操作系统报告的"ctime"。在某些系统上(如Unix)是最新的元数据更改的时间,在其它系统上(如Windows)是创建时间(详细信息参见平台的文档)。
3、 改变当前脚本工作目录;相当于shell下cd
os.chdir("dirname")
4、获取当前工作目录,即当前python脚本工作的目录路径
os.getcwd()
5、运行shell命令,获取执行结果
os.popen(bash command).read())
os.popen() 函数在 Python 3 中被废弃,推荐使用 subprocess 模块来执行外部命令。
6、os.system
运行shell命令,直接显示,适合简单的执行命令场景,复制场景使用subprocess.run
7、路径相关的
os.path模块提供了一组用于处理文件路径和文件名的函数。它可以让你在不同的操作系统上以一致的方式操作路径,无论是 Windows、Linux 还是 macOS。
返回文件的绝对路径
os.path.abspath()
res = os.path.abspath('day23.py')
print(res)
# /Users/sanpangdan/Desktop/python_fullstack/day23/day23.py
将path分割成目录和文件名二元组返回
os.path.split()
res = os.path.split('/Users/sanpangdan/Desktop/python_fullstack/day23/day23.py')
print(res)
# ('/Users/sanpangdan/Desktop/python_fullstack/day23', 'day23.py')
返回path的目录
os.path.dirname()
res = os.path.dirname('/Users/sanpangdan/Desktop/python_fullstack/day23/day23.py')
print(res)
# /Users/sanpangdan/Desktop/python_fullstack/day23
返回path最后的文件名
res = os.path.basename('/Users/sanpangdan/Desktop/python_fullstack/day23/day23.py')
print(res) # day23.py
判断路径存不存在,存在为True
os.path.exists()
res = os.path.exists('/Users/sanpangdan/Desktop/python_fullstack/day23/day23.py')
print(res) # True
如果path是绝对路径,返回True
os.path.isabs()
res = os.path.isabs('/Users/sanpangdan/Desktop/python_fullstack/day23/day23.py')
print(res) # True
如果path是一个存在的文件,返回True。否则返回False
os.path.isfile()
os.path.isdir()
res = os.path.isfile('day23.py')
# os.path.isdir(path)
print(res) #True
路径拼接
方式一: os.path.join()
是 os.path 模块中的一个函数,用于将多个路径组合成一个完整的路径。它会根据操作系统的不同自动选择合适的路径分隔符。
path = os.path.join('/Users/sanpangdan', 'Desktop/python_fullstack', 'day19.py')
print(path) # /Users/sanpangdan/Desktop/python_fullstack/day19.py
方式二:pathlib.Path
# 多个部分一起传(更简洁)
p = Path('data', 'subdir', 'file.txt')
# 等价于上面的 /
p = Path('data') / 'subdir' / 'file.txt'
# 甚至混合使用
p = Path('data') / Path('subdir') / 'file.txt'
pathlib.Path('data')→ 创建一个Path对象,表示路径'data'- 然后使用
/运算符和'subdir'拼接 → 得到新Path对象:data/subdir - 再用
/和'file.txt'拼接 → 得到最终路径:data/subdir/file.txt
获取文件的三个时间
访问、创建、修改时间
os.path.getmtime() os.path.getatime() os.path.getctime()
查看文件的大小
os.path.getsize()
res = os.path.getsize('day23.py')
print(res)
8、os.walk() 遍历一个目录及其子目录中的所有文件和文件夹
os.walk() 是一个函数,用于遍历一个目录及其子目录中的所有文件和文件夹。它返回一个生成器对象,该对象产生三元组 (dirpath, dirnames, filenames),其中:
dirpath:当前正在遍历的目录的路径字符串。dirnames:当前目录下的子目录名称列表。filenames:当前目录下的文件名称列表。
os.walk() 可以让你方便地递归遍历目录结构,处理每个目录和文件的操作。下面是一个基本的使用示例:
import os
# 遍历目录及其子目录中的文件和文件夹
for dirpath, dirnames, filenames in os.walk('path/to/directory'):
# 处理当前目录
print('当前目录:', dirpath)
# 处理子目录
print('子目录:', dirnames)
# 处理文件
print('文件:', filenames)
需要注意的是,os.walk() 是一个递归遍历的函数,会遍历指定目录及其所有子目录中的文件和文件夹。如果目录结构非常大或文件数量非常多,可能会导致遍历时间较长。
三、subprocess
subprocess模块是 Python 中执行外部命令的首选方式。它提供了更强大和灵活的功能,能够处理输入、输出、错误处理和其他操作。
1、subprocess.run
简介: subprocess.run 是一个高层次的 API,旨在更简单地执行命令。它是 Python 3.5 引入的,封装了 subprocess.Popen 的大部分功能,并提供了更简单的接口。
返回值: 返回一个 CompletedProcess 对象,包含了执行命令的输出、错误信息和退出状态等。
import subprocess
# 运行一个命令并获取输出
result = subprocess.run(['ls', '-l'], capture_output=True, text=True, cwd='/healsci/service')
print("Output:", result.stdout)
print("Error:", result.stderr)
print("Exit code:", result.returncode)
补充:
- 通过
subprocess.run的cwd参数指定命令运行所用的工作目录,而无需改变全局的当前工作目录 capture_output=True:该参数指示子进程的标准输出(stdout)和标准错误(stderr)应该被捕获。text=True:启用文本模式处理输出,表示捕获的输出将以字符串形式返回,而不是字节串(bytes)。在 Python 3.7 之前,这个参数被称为universal_newlines=True
2、subprocessPopen()
subprocessPopen()subprocess.Popen 是低层次的 API,提供更多的灵活性和控制权。它允许你与子进程进行交互,例如读取输出流、写入输入流,或对进程进行更复杂的管理。
subprocess.check_output() 函数执行指定的命令,并将输出作为字节流返回。
我们可以使用 .decode() 方法将字节流转换为字符串。
import subprocess
# 执行命令并获取输出
output = subprocess.check_output("command", shell=True)
# 打印输出结果
print(output.decode())
执行命令并获取输出,逐行处理
import subprocess
# 执行命令并逐行获取输出
process = subprocess.Popen("command", stdout=subprocess.PIPE, shell=True)
for line in process.stdout:
print(line.decode().strip())
subprocess.Popen() 函数创建一个子进程来执行指定的命令,并将输出管道连接到主进程。我们可以通过迭代 process.stdout 来逐行获取输出。
执行命令并获取返回值
import subprocess
# 执行命令并获取返回值
return_code = subprocess.call("command", shell=True)
# 打印返回值
print(return_code)
subprocess.call() 函数执行指定的命令,并等待命令执行完毕。返回值是命令的退出状态码。
处理输入和输出(下面两种方式都可以)
import subprocess
-----------------------------------------------------------------------------
# 处理输入和输出
process = subprocess.Popen(["command"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
output, error = process.communicate(input="input_data".encode())
# 打印输出结果和错误信息
print(output.decode())
print(error.decode())
-----------------------------------------------------------------------------
res=subprocess.Popen('ipconfig', shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
print("stdout:", res.stdout.read().decode('gbk'))
print("stderr:", res.stderr.read().decode('gbk'))
Windows内部默认的编码是GBK
-----------------------------------------------------------------------------
在这个例子中,subprocess.Popen() 函数创建一个子进程来执行指定的命令,并将输入和输出管道连接到主进程。我们使用 process.communicate() 方法将输入数据传递给命令,并获取输出结果和错误信息。
四、shutil
提供了许多文件和目录操作的高级函数。它可以用于复制、移动、重命名、删除文件和目录等操作。
1、复制文件或目录:shutil.copy()、shutil.copy2()、shutil.copyfile()、shutil.copytree()
import shutil
# 复制文件
shutil.copy('source_file.txt', 'target_directory/')
# 复制文件,保留元数据(如权限、时间戳等)
shutil.copy2('source_file.txt', 'target_directory/')
# 复制文件内容(不包括元数据)
shutil.copyfile('source_file.txt', 'target_file.txt')
# 复制目录及其内容
shutil.copytree('source_directory/', 'target_directory/')
2、移动文件或目录:shutil.move()
import shutil
# 移动文件
shutil.move('source_file.txt', 'target_directory/')
# 移动目录
shutil.move('source_directory/', 'target_directory/')
3、删除文件或目录:shutil.rmtree()
import shutil
# 删除文件
os.remove('file.txt')
# 删除空目录
os.rmdir('empty_directory/')
# 删除目录及其内容(包括子目录和文件)
shutil.rmtree('directory/')
4、重命名文件或目录:shutil.move()
import shutil
# 重命名文件
shutil.move('old_name.txt', 'new_name.txt')
# 重命名目录
shutil.move('old_directory/', 'new_directory/')
注意:在使用这些函数之前,请确保目标路径已经存在,并且对于移动、复制等操作,请确保有足够的权限。
5、归档和压缩文件的操作
shutil.make_archive() shutil.unpack_archive()

浙公网安备 33010602011771号