Python os
/ sys
/ shutil
模块:系统级操作的极限运用 (讲座模式)
各位朋友们,大家好!我是今天的讲师,一个和Python打了多年交道的老码农。今天咱们不聊高深莫测的算法,也不谈玄之又玄的架构,咱们就来点实在的——聊聊Python里那些能让你直接和操作系统“对话”的模块:os
、sys
和 shutil
。
别看它们的名字朴实无华,但它们的功能强大到超乎你的想象。有了它们,你可以像一个操作系统管理员一样,轻松管理你的文件、目录,甚至控制程序的运行。所以,准备好,咱们要开始一场系统级操作的“极限运动”了!
第一幕:os
模块 – 我是你的文件总管
os
模块,可以理解为 “operating system” 的缩写,它就像一个万能遥控器,让你在 Python 代码里直接控制操作系统。无论你是想创建目录、删除文件、还是获取环境变量,os
模块都能帮你搞定。
1. 文件和目录操作:基础中的基础
-
os.getcwd()
:告诉你现在在哪儿import os current_directory = os.getcwd() print(f"当前工作目录是:{current_directory}")
这个函数就像你的 GPS,告诉你当前 Python 脚本运行的目录。
-
os.chdir(path)
:换个地方溜达import os os.chdir("/tmp") # 切换到 /tmp 目录 print(f"当前工作目录已切换至:{os.getcwd()}")
就像你在命令行里用
cd
命令一样,os.chdir()
可以让你在不同的目录之间切换。 -
os.mkdir(path)
和os.makedirs(path)
:造房子,盖别墅import os os.mkdir("my_new_directory") # 创建一个名为 my_new_directory 的目录 os.makedirs("my_new_directory/subdir1/subdir2") # 创建多层目录
os.mkdir()
只能创建单层目录,如果目录已经存在就会报错。而os.makedirs()
则可以创建多层目录,如果中间的目录不存在,它会自动创建。你可以把它想象成盖别墅,一层一层地往上盖。 -
os.rmdir(path)
和shutil.rmtree(path)
:拆房子,夷为平地import os import shutil os.rmdir("my_new_directory") # 删除一个空目录 shutil.rmtree("my_new_directory") # 删除包含内容的目录
os.rmdir()
只能删除空目录,如果目录里有文件或者其他目录,就会报错。shutil.rmtree()
则可以删除包含内容的目录,注意,这个操作不可逆,使用时要小心! -
os.remove(path)
:抹去痕迹import os os.remove("my_file.txt") # 删除一个文件
这个函数用于删除文件,就像你在命令行里用
rm
命令一样。 -
os.rename(old_path, new_path)
:改头换面import os os.rename("old_file.txt", "new_file.txt") # 重命名文件 os.rename("old_directory", "new_directory") # 重命名目录
你可以用这个函数来重命名文件或者目录。
2. 文件属性:知己知彼,百战不殆
-
os.path.exists(path)
:它存在吗?import os if os.path.exists("my_file.txt"): print("文件存在") else: print("文件不存在")
这个函数可以检查文件或者目录是否存在。
-
os.path.isfile(path)
和os.path.isdir(path)
:它是文件还是目录?import os if os.path.isfile("my_file.txt"): print("这是一个文件") elif os.path.isdir("my_directory"): print("这是一个目录")
这两个函数可以判断给定的路径是文件还是目录。
-
os.path.getsize(path)
:它有多重?import os file_size = os.path.getsize("my_file.txt") print(f"文件大小是:{file_size} 字节")
这个函数可以获取文件的大小,单位是字节。
-
os.path.getmtime(path)
:最后一次见它是什么时候?import os import time last_modified_time = os.path.getmtime("my_file.txt") print(f"最后修改时间是:{time.ctime(last_modified_time)}")
这个函数可以获取文件的最后修改时间,返回的是一个时间戳,可以用
time.ctime()
函数转换成可读的格式。
3. 路径处理:迷宫探险的地图
-
os.path.abspath(path)
:告诉我你的绝对位置import os absolute_path = os.path.abspath("my_file.txt") print(f"绝对路径是:{absolute_path}")
这个函数可以获取文件的绝对路径,也就是从根目录开始的完整路径。
-
os.path.dirname(path)
和os.path.basename(path)
:你的父母是谁?你的名字叫什么?import os path = "/path/to/my/file.txt" directory = os.path.dirname(path) filename = os.path.basename(path) print(f"目录是:{directory}") print(f"文件名是:{filename}")
os.path.dirname()
可以获取文件所在的目录,os.path.basename()
可以获取文件名。 -
os.path.join(path1, path2, ...)
:把碎片拼起来import os path = os.path.join("/path/to", "my", "file.txt") print(f"拼接后的路径是:{path}")
这个函数可以把多个路径片段拼接成一个完整的路径,它会自动处理路径分隔符,让你的代码在不同的操作系统上都能正常运行。
4. 系统信息:了解你的环境
-
os.environ
:环境变量的宝藏import os username = os.environ.get("USERNAME") print(f"当前用户名是:{username}")
os.environ
是一个字典,包含了所有的环境变量。你可以通过os.environ.get()
方法来获取某个环境变量的值。 -
os.system(command)
:执行系统命令import os os.system("ls -l") # 执行 ls -l 命令
这个函数可以执行系统命令,就像你在命令行里输入命令一样。但是,使用
os.system()
要小心,因为它可能会执行一些危险的命令,导致系统崩溃。建议使用subprocess
模块来执行系统命令,它更加安全和灵活。
第二幕:sys
模块 – 我是你的程序指挥官
sys
模块,可以理解为 "system" 的缩写,它提供了一些与 Python 解释器交互的函数和变量。你可以用它来获取命令行参数、控制程序的退出、甚至修改 Python 的搜索路径。
1. 命令行参数:程序的入口
-
sys.argv
:接收来自世界的问候import sys print(f"命令行参数是:{sys.argv}")
sys.argv
是一个列表,包含了所有的命令行参数。第一个元素是脚本的名称,后面的元素是用户输入的参数。例如,如果你在命令行里输入
python my_script.py arg1 arg2
,那么sys.argv
的值就是['my_script.py', 'arg1', 'arg2']
。
2. 程序控制:进退自如
-
sys.exit(status)
:优雅地谢幕import sys if some_error_occurred: print("程序出错,即将退出") sys.exit(1) # 退出程序,返回状态码 1
sys.exit()
可以让程序退出,你可以指定一个状态码,告诉操作系统程序是正常退出还是异常退出。
3. 模块搜索路径:寻找宝藏的地图
-
sys.path
:告诉 Python 去哪里找模块import sys print(f"模块搜索路径是:{sys.path}")
sys.path
是一个列表,包含了 Python 解释器搜索模块的路径。你可以修改sys.path
,让 Python 能够找到你自定义的模块。import sys sys.path.append("/path/to/my/module") # 添加新的模块搜索路径
4. 标准输入输出:与世界交流
-
sys.stdin
、sys.stdout
和sys.stderr
:程序的眼睛、嘴巴和耳朵sys.stdin
是标准输入流,你可以用它来读取用户的输入。sys.stdout
是标准输出流,你可以用它来打印程序的输出。sys.stderr
是标准错误流,你可以用它来打印程序的错误信息。import sys # 从标准输入读取一行 line = sys.stdin.readline().strip() print(f"你输入的是:{line}") # 向标准输出打印信息 sys.stdout.write("这是一条输出信息n") # 向标准错误打印错误信息 sys.stderr.write("这是一个错误信息n")
第三幕:shutil
模块 – 我是你的文件搬运工
shutil
模块,可以理解为 "shell utilities" 的缩写,它提供了一些高级的文件操作函数,比如复制文件、移动文件、压缩文件等。你可以把它想象成一个文件搬运工,帮你轻松处理各种文件操作。
1. 文件复制:克隆大法
-
shutil.copy(src, dst)
:复制文件import shutil shutil.copy("source_file.txt", "destination_file.txt") # 复制文件
这个函数可以复制文件,它会把
src
文件的内容复制到dst
文件。如果dst
文件已经存在,它会被覆盖。 -
shutil.copytree(src, dst)
:复制目录import shutil shutil.copytree("source_directory", "destination_directory") # 复制目录
这个函数可以复制整个目录,包括目录里的所有文件和子目录。如果
dst
目录已经存在,就会报错。
2. 文件移动:乾坤大挪移
-
shutil.move(src, dst)
:移动文件或目录import shutil shutil.move("source_file.txt", "destination_directory") # 移动文件到目录 shutil.move("source_directory", "destination_directory") # 移动目录到目录
这个函数可以移动文件或目录,它会把
src
文件或目录移动到dst
目录。如果dst
已经存在同名的文件或目录,它会被覆盖。
3. 文件压缩:打包带走
-
shutil.make_archive(base_name, format, root_dir)
:把东西打包成压缩包import shutil shutil.make_archive("my_archive", "zip", "/path/to/my/directory") # 创建一个 zip 压缩包
这个函数可以把一个目录压缩成一个压缩包。
base_name
是压缩包的名字,format
是压缩格式,root_dir
是要压缩的目录。常用的压缩格式有 "zip"、"tar"、"gztar"、"bztar"、"xztar"。
4. 磁盘空间:家底有多少
-
shutil.disk_usage(path)
:看看还剩多少空间import shutil total, used, free = shutil.disk_usage("/") # 获取根目录的磁盘使用情况 print(f"总空间:{total // (2**30)} GB") print(f"已用空间:{used // (2**30)} GB") print(f"可用空间:{free // (2**30)} GB")
这个函数可以获取磁盘的使用情况,包括总空间、已用空间和可用空间。
总结:系统级操作的利器
咱们今天一起学习了 os
、sys
和 shutil
这三个强大的模块,它们就像 Python 的左膀右臂,让你能够轻松地进行系统级操作。
为了方便大家记忆,我给大家整理了一个表格:
模块 | 常用函数 | 功能描述 |
---|---|---|
os |
os.getcwd() |
获取当前工作目录 |
os.chdir(path) |
改变当前工作目录 | |
os.mkdir(path) / os.makedirs(path) |
创建目录 | |
os.rmdir(path) / shutil.rmtree(path) |
删除目录 | |
os.remove(path) |
删除文件 | |
os.rename(old_path, new_path) |
重命名文件或目录 | |
os.path.exists(path) |
检查文件或目录是否存在 | |
os.path.isfile(path) / os.path.isdir(path) |
检查路径是文件还是目录 | |
os.path.getsize(path) |
获取文件大小 | |
os.path.abspath(path) |
获取绝对路径 | |
sys |
sys.argv |
获取命令行参数 |
sys.exit(status) |
退出程序 | |
sys.path |
获取模块搜索路径 | |
shutil |
shutil.copy(src, dst) |
复制文件 |
shutil.copytree(src, dst) |
复制目录 | |
shutil.move(src, dst) |
移动文件或目录 | |
shutil.make_archive(base_name, format, root_dir) |
创建压缩包 | |
shutil.disk_usage(path) |
获取磁盘使用情况 |
当然,这只是冰山一角,还有很多其他的函数等待你去探索。记住,熟能生巧,多练习,多实践,你才能真正掌握这些工具,成为一个系统级操作的高手!
最后,提醒大家,在使用这些模块进行系统级操作时,一定要小心谨慎,避免误操作导致数据丢失或者系统崩溃。切记,安全第一!
今天的讲座就到这里,谢谢大家!希望大家有所收获,下次再见!