我们将主要使用 Python 内置的 os 模块和更现代、更推荐的 pathlib 模块。
获取当前工作目录
当前工作目录是 Python 脚本当前正在操作的默认目录。
使用 os 模块
os.getcwd() 函数可以获取当前工作目录的字符串。
import os
# 获取当前工作目录
current_dir = os.getcwd()
print(f"当前工作目录是: {current_dir}")
# 输出示例: C:\Users\YourUser\Documents\PythonProject
列出目录内容
如果你想查看一个目录下有哪些文件和子目录。
使用 os 模块
os.listdir(path): 返回一个包含path指定目录下所有文件和文件夹名称的列表。
import os
# 列出当前目录下的内容
contents = os.listdir('.')
print(f"当前目录下的内容: {contents}")
# 列出特定目录下的内容
# 列出 C:\Windows 目录下的内容
# windows_contents = os.listdir('C:\\Windows') # 注意 Windows 路径的转义
# print(f"C:\\Windows 目录下的内容: {windows_contents}")
重要提示:路径分隔符
在 Windows 中,路径分隔符是反斜杠 \,但在 Python 字符串中,\ 是一个转义字符(\n 代表换行),为了避免混淆,有几种常见的写法:
- 使用双反斜杠:
'C:\\Users\\YourUser' - 使用原始字符串 (推荐): 在字符串前加
r,告诉 Python 忽略所有转义字符。r'C:\Users\YourUser' - 使用正斜杠: Python 通常也能正确处理正斜杠,
'C:/Users/YourUser'。
创建和删除目录
使用 os 模块
os.mkdir(path): 创建一个单层目录,如果父目录不存在,会抛出FileNotFoundError。os.makedirs(path): 创建多层目录(包括所有必需的父目录),如果目录已存在,会抛出FileExistsError,可以通过exist_ok=True参数来避免此错误。os.rmdir(path): 删除一个空目录,如果目录非空,会抛出OSError。os.removedirs(path): 递归删除目录,如果目录为空,一旦遇到一个非空目录,就会停止。
import os
# 创建一个单层目录 'new_folder'
try:
os.mkdir('new_folder')
print("目录 'new_folder' 创建成功")
except FileExistsError:
print("目录 'new_folder' 已存在")
except OSError as e:
print(f"创建目录失败: {e}")
# 创建一个多层目录 'parent/child/grandchild'
try:
os.makedirs('parent/child/grandchild', exist_ok=True)
print("多层目录 'parent/child/grandchild' 创建成功")
except OSError as e:
print(f"创建多层目录失败: {e}")
# 删除一个空目录 'new_folder'
try:
if os.path.exists('new_folder'):
os.rmdir('new_folder')
print("目录 'new_folder' 删除成功")
except OSError as e:
print(f"删除目录失败: {e}")
路径拼接和检查
手动拼接路径字符串(如 folder + '\\' + filename)容易出错,尤其是在不同操作系统上,Python 提供了更好的方法。
使用 os 模块
os.path.join(path1, path2, ...): 强烈推荐,智能地使用当前操作系统的正确路径分隔符来拼接路径。os.path.exists(path): 检查路径是否存在(文件或目录)。os.path.isdir(path): 检查路径是否是一个目录。os.path.isfile(path): 检查路径是否是一个文件。
import os
# 使用 os.path.join 拼接路径
# 这样写是跨平台的,代码更健壮
file_path = os.path.join('parent', 'child', 'data.txt')
print(f"拼接后的路径: {file_path}")
# 检查路径是否存在
if os.path.exists(file_path):
print(f"路径 '{file_path}' 存在")
else:
print(f"路径 '{file_path}' 不存在")
# 检查是否是目录
if os.path.isdir('parent'):
print("'parent' 是一个目录")
更现代的方式:pathlib 模块 (Python 3.4+)
pathlib 是面向对象的路径操作库,语法更简洁、更直观,是目前推荐的做法,它将路径表示为 Path 对象,而不是简单的字符串。
核心概念:Path 对象
你需要从 pathlib 导入 Path。
from pathlib import Path
常用操作
-
创建
Path对象# 创建一个 Path 对象 current_dir = Path('.') print(f"当前工作目录: {current_dir}") # 输出示例: . (在脚本所在目录下运行时) -
获取绝对路径
# 获取绝对路径 abs_path = current_dir.resolve() print(f"绝对路径: {abs_path}") -
列出目录内容
# 列出目录内容 (返回一个生成器,包含 Path 对象) # .iterdir() 是迭代器,更节省内存 print("\n列出当前目录内容:") for item in Path('.').iterdir(): print(item) -
拼接路径 (使用 运算符)
# 使用 / 运算符拼接路径,非常直观! data_file = Path('parent') / 'child' / 'data.txt' print(f"\n拼接后的路径: {data_file}") -
检查路径属性
# 检查路径是否存在 print(f"\n路径 '{data_file}' 是否存在: {data_file.exists()}") # 检查是否是目录 print(f"'parent' 是否是目录: {Path('parent').is_dir()}") # 检查是否是文件 print(f"'data.txt' 是否是文件: {Path('data.txt').is_file()}") -
创建和删除目录
# 创建目录 (makedirs 对应 pathlib 的 mkdir) # parents=True 表示创建所有父目录 # exist_ok=True 表示如果目录已存在,不报错 new_dir = Path('project/src') new_dir.mkdir(parents=True, exist_ok=True) print(f"\n目录 '{new_dir}' 创建成功") # 删除目录 (rmdir 对应 pathlib 的 rmdir) # 注意:rmdir 只能删除空目录 if new_dir.exists(): # 要删除非空目录及其内容,需要先递归删除内容 # for item in new_dir.glob('**/*'): # 递归查找所有文件和目录 # item.unlink() # 删除文件 # if item.is_dir(): # item.rmdir() # 删除空目录 # new_dir.rmdir() # 最后删除顶层空目录 print(f"准备删除目录 '{new_dir}' 及其内容...") # 注意:直接删除非空目录需要 shutil.rmtree import shutil shutil.rmtree(new_dir) print(f"目录 '{new_dir}' 已删除")
os vs pathlib
功能
os 模块 (过程式)
pathlib 模块 (面向对象)
推荐度
获取当前目录
os.getcwd()
Path.cwd()
pathlib 更简洁
路径拼接
os.path.join()
Path / Path 或 Path / str
pathlib 运算符更直观
os.listdir()
Path.iterdir()
pathlib 返回对象,更易用
检查路径
os.path.exists(), isdir(), isfile()
Path.exists(), is_dir(), is_file()
pathlib 语法更统一
创建目录
os.mkdir(), os.makedirs()
Path.mkdir(parents=True, exist_ok=True)
pathlib 参数更清晰
删除目录
os.rmdir() (仅空)
Path.rmdir() (仅空)
pathlib 更一致
删除非空目录
shutil.rmtree()
shutil.rmtree() (需导入 shutil)
两者都需要 shutil
对于新的 Python 项目,强烈推荐使用 pathlib,它的 API 设计更现代、更安全,代码可读性更高,能减少很多路径拼接相关的错误。os 模块依然非常有用,尤其是在需要与旧代码交互或进行一些底层的、非路径相关的操作系统操作时。
| 功能 | os 模块 (过程式) |
pathlib 模块 (面向对象) |
推荐度 |
|---|---|---|---|
| 获取当前目录 | os.getcwd() |
Path.cwd() |
pathlib 更简洁 |
| 路径拼接 | os.path.join() |
Path / Path 或 Path / str |
pathlib 运算符更直观 |
os.listdir() |
Path.iterdir() |
pathlib 返回对象,更易用 |
|
| 检查路径 | os.path.exists(), isdir(), isfile() |
Path.exists(), is_dir(), is_file() |
pathlib 语法更统一 |
| 创建目录 | os.mkdir(), os.makedirs() |
Path.mkdir(parents=True, exist_ok=True) |
pathlib 参数更清晰 |
| 删除目录 | os.rmdir() (仅空) |
Path.rmdir() (仅空) |
pathlib 更一致 |
| 删除非空目录 | shutil.rmtree() |
shutil.rmtree() (需导入 shutil) |
两者都需要 shutil |
对于新的 Python 项目,强烈推荐使用 pathlib,它的 API 设计更现代、更安全,代码可读性更高,能减少很多路径拼接相关的错误。os 模块依然非常有用,尤其是在需要与旧代码交互或进行一些底层的、非路径相关的操作系统操作时。
