Python的os模块:操作系统交互的得力助手
对话实录
小白:(苦恼)我想用 Python 获取当前目录下的所有文件,还想创建新文件夹,该怎么办呢?
专家:(拿出魔法书)用Python的os模块,轻松与操作系统交互,实现文件和目录操作!os模块里还有很多细分功能,比如os.path模块,在路径处理上非常实用。
os模块目录操作
函数 | 用法 | 说明 |
os.getcwd | os.getcwd() | 获取当前工作目录 |
os.chdir | os.chdir(path) | 更改工作目录 |
os.listdir | os.listdir(path) | 列出目录内容 |
os.mkdir | os.mkdir(path) | 创建单个目录 |
os.makedirs | os.makedirs(path) | 创建多级目录 |
os.rename | os.rename(src, dst) | 重命名文件或目录 |
os.stat | os.stat(path) | 获取文件或目录状态 |
os.walk | os.walk(top) | 递归遍历目录树 |
1. 获取当前工作目录
os模块的getcwd函数可以获取当前 Python 脚本所在的工作目录。
import os
current_dir = os.getcwd()
print(f"当前工作目录是: {current_dir}")
运行这段代码,你就能看到当前脚本所处的目录路径,就像给你在文件系统的 “地图” 上标亮了当前位置。
2. 更改工作目录
通过chdir函数,能切换到指定目录。比如要切换到/home/user/Documents目录:
import os
new_dir = "/home/user/Documents"
os.chdir(new_dir)
current_dir = os.getcwd()
print(f"现在的工作目录已变为: {current_dir}")
3.列出目录内容
listdir函数可列出指定目录下的所有文件和子目录,返回一个list。假设要列出当前目录下的内容:
import os
content = os.listdir(path='.') #'.'表示当前目录
for item in content:
print(item)
运行后,当前目录中的所有文件和文件夹名称都会一一列出,帮助你快速了解目录构成。
4.创建目录
使用mkdir函数创建单个目录(当文件夹存在时会报错),makedirs函数可创建多级目录。例如创建一个名为new_folder的文件夹:
import os
new_folder = "new_folder"
os.mkdir(new_folder)
print(f"{new_folder} 文件夹已创建")
若要创建多级目录,如
parent_folder/child_folder:
import os
multi_dir = "parent_folder/child_folder"
os.makedirs(multi_dir)
print(f"{multi_dir} 多级目录已创建")
轻松在文件系统中搭建新的目录结构。
5.文件重命名
rename函数能对文件或目录进行重命名。比如将old_file.txt重命名为new_file.txt:
import os
old_name = "old_file.txt"
new_name = "new_file.txt"
os.rename(old_name, new_name)
print(f"{old_name} 已重命名为 {new_name}")
就像在操作系统中右键选择重命名一样简单。
6.获取文件状态
stat函数可以获取文件或目录的详细信息,如文件大小、修改时间等。以获取example.txt文件的信息为例:
import os
file_info = os.stat('example.txt')
#os.stat返回结果:
os.stat_result(st_mode=16832, st_ino=245263, st_dev=16777234, st_nlink=15, st_uid=501, st_gid=20, st_size=480,st_atime=1713104547,st_mtime=1713104547, st_ctime=1713104547)
print(f"文件大小: {file_info.st_size} 字节")
print(f"最后修改时间: {file_info.st_mtime}")
7.修改文件权限
在 Linux 和 macOS 系统中,可以使用chmod函数修改文件或目录的权限。比如将example.txt文件的权限设置为所有者可读可写可执行,组用户和其他用户只读:
import os
os.chmod('example.txt', 0o744)
这里0o744是八进制表示的权限,对应rwx-r-r。通过修改权限,可灵活控制文件的访问级别。
8.删除文件
remove函数用于删除指定文件。例如删除unwanted_file.txt文件:
import os
os.remove('unwanted_file.txt')
print('unwanted_file.txt已删除')
执行后,该文件会从文件系统中移除。不过要谨慎操作,因为删除后文件难以恢复。
9.删除目录
rmdir函数可删除空目录,而对于非空目录,需要使用shutil.rmtree函数(shutil模块是对os模块文件操作的补充)。例如删除名为empty_folder的空目录:
import os
os.rmdir('empty_folder')
print('empty_folder已删除')
removedirs函数可以递归删除多层空目录,以下执行会依次删除dir3/dir2/dir1目录,但是某个目录如果不为空,则会报错。
os.removedirs('/Users/dir1/dir2/dir3')
若要删除包含文件和子目录的non_empty_folder目录:
import shutil
shutil.rmtree('non_empty_folder')
print('non_empty_folder已删除')
使用shutil.rmtree时要格外小心,因为它会递归删除目录及其所有内容。
10.查找文件
有时候需要在指定目录及其子目录中查找特定文件。虽然os模块本身没有直接的查找函数,但结合os.walk可以实现。比如查找/home/user目录下所有的.txt文件:
import os
for root, dirs, files in os.walk('/home/user'):
for file in files:
if file.endswith('.txt'):
print(os.path.join(root, file))
通过这种方式,能快速定位到符合条件的文件,在处理大量文件时非常实用。
os.path路径操作
1.路径拼接
os.path.join函数在路径拼接上极为实用,能避免因操作系统不同导致的路径分隔符问题。例如,要拼接/home/user和Documents/file.txt:
import os
base_path = "/home/user"
sub_path = "Documents/file.txt"
full_path = os.path.join(base_path, sub_path)
print(f"拼接后的路径: {full_path}")
# 在Linux和macOS上输出: /home/user/Documents/file.txt
# 在Windows上输出: C:\home\user\Documents\file.txt(假设C:为当前盘)
无论在何种操作系统下,都能正确拼接路径,确保代码的跨平台性。
2.获取文件名和目录名
os.path.basename函数用于获取路径中的文件名部分,os.path.dirname函数用于获取路径中的目录名部分。例如:
import os
file_path = "/home/user/Documents/file.txt"
file_name = os.path.basename(file_path)
dir_name = os.path.dirname(file_path)
print(f"文件名: {file_name}") # 输出: file.txt
print(f"目录名: {dir_name}") # 输出: /home/user/Documents
在处理文件路径时,这两个函数能帮助你快速提取关键信息。
3.检查路径类型
os.path.isfile函数可判断路径是否指向一个文件,os.path.isdir函数可判断路径是否指向一个目录。比如:
import os
file_path = "/home/user/Documents/file.txt"
dir_path = "/home/user/Documents"
print(os.path.isfile(file_path)) # 输出: True(假设文件存在)
print(os.path.isdir(dir_path)) # 输出: True(假设目录存在)
在进行文件或目录操作前,通过这些函数检查路径类型,可避免因路径类型错误导致的操作失败。
4.获取文件的绝对路径
os.path.abspath函数可以将相对路径转换为绝对路径。例如:
import os
relative_path = "test.txt"
absolute_path = os.path.abspath(relative_path)
print(f"绝对路径: {absolute_path}")
这在处理不同目录下的文件,需要明确文件的完整路径时非常有用。
5.判断文件是否存在
os.path.exists函数除了在前面提到的避免操作不存在文件的场景外,还可用于判断文件或目录是否存在。比如:
import os
file_path = "example.txt"
if os.path.exists(file_path):
print(f"{file_path} 存在")
else:
print(f"{file_path} 不存在")
在编写程序时,提前检查文件或目录的存在性,能增强程序的稳定性。
6.分割目录和文件名
os.path.split(path)将路径分割为目录和文件名(返回一个元组tuple)
print(os.path.split('dir1/dir2/1.txt'))
#输出为('dir1/dir2', '1.txt')
7.返回文件的大小
os.path.getsize(path)返回指定文件的大小(以字节byte为单位)。
print(os.path.getsize('/dir1/dir2/1.txt'))
#输出为81字节
8.路径分隔符
os.path.sep表示路径分隔符路径分割符,windows和mac上是‘/’
print(os.path.sep)
#输出为/
9.获取操作系统名称
os.name可以获取当前运行的操作系统名称。例如:
import os
os_name = os.name
if os_name == 'posix':
print("当前操作系统是类Unix系统(Linux、macOS等)")
elif os_name == 'nt':
print("当前操作系统是Windows")
根据不同的操作系统名称,你可以编写具有差异化功能的代码,提升程序的适用性。
闭坑指南
1.路径分隔符问题
不同操作系统的路径分隔符不同,Windows 使用反斜杠\,而 Linux 和 macOS 使用正斜杠/。在编写跨平台代码时,直接写死路径分隔符会导致错误。例如在 Windows 下:
# 错误示范,在Linux或macOS上会出错
file_path = "C:\Program Files\example.txt"
# 正确做法,使用os.path.join函数
import os
file_path = os.path.join('C:', 'Program Files', 'example.txt')
os.path.join函数会根据操作系统自动选择正确的路径分隔符,保证代码的跨平台性。
2.权限不足错误
在进行文件或目录操作时,如果权限不足会报错。比如在 Linux 系统中,尝试在/root目录下创建文件(普通用户无权限):
import os
# 错误示范,普通用户无权限在/root下创建文件
os.mkdir('/root/new_folder')
运行会提示权限不足错误。务必确保当前运行 Python 脚本的用户有足够权限执行相应操作。
3.操作不存在的文件或目录
对不存在的文件或目录进行操作(如删除、重命名)会引发错误。例如删除一个不存在的文件:
import os
# 错误示范,文件不存在会报错
os.remove('non_existent_file.txt')
在进行操作前,最好先用os.path.exists函数检查目标是否存在。
import os
file_to_delete = 'non_existent_file.txt'
if os.path.exists(file_to_delete):
os.remove(file_to_delete)
else:
print(f"{file_to_delete} 不存在")
环境变量操作
os.environ可用于获取和操作环境变量。比如获取系统的PATH环境变量:
import os
path_env = os.environ.get('PATH')
print(f"PATH环境变量: {path_env}")
也可以临时设置环境变量:
import os
os.environ['TEMP_VARIABLE'] = 'example_value'
value = os.environ.get('TEMP_VARIABLE')
print(f"临时环境变量值: {value}")
在某些需要特定环境变量的程序调用中很有用。
执行系统命令
os.system函数能在 Python 中执行系统命令。例如在 Windows 下打开计算器程序:
import os
os.system('calc')
在 Linux 下更新软件包列表:
import os
os.system('sudo apt update')
不过要注意,os.system在处理复杂命令和获取命令输出时存在一定局限性,更推荐使用subprocess模块进行更强大的命令执行和输出处理。
小白:(恍然大悟)原来os模块有这么多实用功能,能让我轻松操控操作系统!
专家:(微笑)记住:掌握os模块,你在 Python 中与操作系统交互将更加得心应手!