网站首页 > 基础教程 正文
对话实录
小白:(苦恼)我想用 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/Desktop/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")
根据不同的操作系统名称,你可以编写具有差异化功能的代码,提升程序的适用性。
闭坑指南
路径分隔符问题
不同操作系统的路径分隔符不同,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函数会根据操作系统自动选择正确的路径分隔符,保证代码的跨平台性。
权限不足错误
在进行文件或目录操作时,如果权限不足会报错。比如在 Linux 系统中,尝试在/root目录下创建文件(普通用户无权限):
import os
# 错误示范,普通用户无权限在/root下创建文件
os.mkdir('/root/new_folder')
运行会提示权限不足错误。务必确保当前运行 Python 脚本的用户有足够权限执行相应操作。
操作不存在的文件或目录
对不存在的文件或目录进行操作(如删除、重命名)会引发错误。例如删除一个不存在的文件:
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 中与操作系统交互将更加得心应手!
常用函数速查表
函数 | 用法 | 说明 |
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) | 递归遍历目录树 |
os.environ | os.environ.get('VAR_NAME') | 获取环境变量 |
os.system | os.system(command) | 执行系统命令 |
os.chmod | os.chmod(path, mode) | 修改文件或目录权限 |
os.remove | os.remove(path) | 删除文件 |
os.rmdir | os.rmdir(path) | 删除空目录 |
os.path.join | os.path.join(path1, path2) | 拼接路径 |
os.path.basename | os.path.basename(path) | 获取文件名 |
os.path.dirname | os.path.dirname(path) | 获取目录名 |
os.path.isfile | os.path.isfile(path) | 判断是否为文件 |
os.path.isdir | os.path.isdir(path) | 判断是否为目录 |
os.path.abspath | os.path.abspath(path) | 获取绝对路径 |
os.path.exists | os.path.exists(path) | 判断路径是否存在 |
os.name | os.name | 获取操作系统名称 |
猜你喜欢
- 2025-05-05 1G内存如何对40亿QQ号去重?(qq内存50g)
- 2025-05-05 引爆你的效率!深入探索 Python os 模块那些不为人知的高阶玩法
- 2025-05-05 python 进阶突破——内置模块(Standard Library)
- 2025-05-05 10行Python代码实现智能文件整理(python整理文件到指定文件夹)
- 2025-05-05 Python办公自动化系列篇之六:文件系统与操作系统任务
- 2025-05-05 Windows如何批量修改文件后缀名(电脑如何批量修改文件后缀名)
- 2025-05-05 Python常用内置模块介绍——文件与系统操作详解
- 2025-05-05 每天一个Python库:标准库 os 模块,玩转文件和目录操作!
- 2025-05-05 Python目录与文件操作教程(python编程目录)
- 2025-05-05 Python 开发工程师必会的 5 个文件操作库
- 最近发表
-
- 1G内存如何对40亿QQ号去重?(qq内存50g)
- Python的os模块:操作系统交互的得力助手
- 引爆你的效率!深入探索 Python os 模块那些不为人知的高阶玩法
- python 进阶突破——内置模块(Standard Library)
- 10行Python代码实现智能文件整理(python整理文件到指定文件夹)
- Python办公自动化系列篇之六:文件系统与操作系统任务
- Windows如何批量修改文件后缀名(电脑如何批量修改文件后缀名)
- Python常用内置模块介绍——文件与系统操作详解
- 每天一个Python库:标准库 os 模块,玩转文件和目录操作!
- Python目录与文件操作教程(python编程目录)
- 标签列表
-
- 菜鸟教程 (58)
- jsp (69)
- pythonlist (60)
- gitpush (78)
- gitreset (66)
- python字典 (67)
- dockercp (63)
- pythonif (68)
- pythonifelse (59)
- deletesql (62)
- c++模板 (62)
- c#event (59)
- linuxgzip (68)
- 字符串连接 (73)
- nginx配置文件详解 (61)
- html标签 (69)
- c++初始化列表 (64)
- exec命令 (59)
- mysqlinnodbmyisam区别 (63)
- arraylistadd (66)
- node教程 (59)
- console.table (62)
- mysqldatesub函数 (63)
- window10java环境变量设置 (66)
- c++虚函数和纯虚函数的区别 (66)