Python 文件操作指南:深入掌握文件的创建、写入、删除与目录管理(os, shutil, pathlib 模块详解)108
在软件开发中,文件和目录的管理是任何应用程序不可或缺的核心功能。无论是配置文件的读写、用户数据的存储、日志记录,还是临时文件的处理,高效且安全的文件操作能力都至关重要。Python 以其简洁的语法和强大的标准库,为开发者提供了极其便利的文件和目录操作接口。本文将作为一份全面的指南,带您深入探索 Python 中如何创建、写入、读取和删除文件,以及管理目录,重点介绍 `os`、`shutil` 和现代的 `pathlib` 模块。
Python 文件创建与写入:基础操作
在 Python 中,文件操作的核心是内置的 `open()` 函数。它允许我们打开一个文件,并根据指定模式进行读、写或追加等操作。掌握不同的文件打开模式,是安全高效文件操作的第一步。
1. 使用 `open()` 函数创建新文件并写入
`open()` 函数的基本语法是 `open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)`。其中,`file` 参数是文件路径,`mode` 参数决定了文件的打开方式。
模式 'w':写入模式(会覆盖现有文件)
当使用 `'w'` 模式打开文件时,如果文件不存在,则会创建一个新文件;如果文件已存在,则会清空文件内容,然后从文件开头写入新内容。这意味着任何原有数据都将被永久删除,因此在使用时务必小心。
# 示例1: 使用 'w' 模式创建并写入文件
file_path_w = ""
try:
with open(file_path_w, 'w', encoding='utf-8') as f:
("这是使用 'w' 模式写入的第一行。")
("第二行内容。")
print(f"文件 '{file_path_w}' 已创建并写入内容 (覆盖模式)。")
# 再次写入,验证覆盖效果
with open(file_path_w, 'w', encoding='utf-8') as f:
("这是第二次写入,第一次的内容已被覆盖。")
print(f"文件 '{file_path_w}' 再次写入,内容已被覆盖。")
except IOError as e:
print(f"文件操作失败: {e}")
模式 'x':独占创建模式(文件存在则报错)
如果您希望确保只在文件不存在的情况下才创建并写入,可以使用 `'x'` 模式。如果文件已经存在,`open()` 函数会抛出 `FileExistsError` 异常,这对于避免意外覆盖现有文件非常有用。
# 示例2: 使用 'x' 模式独占创建文件
file_path_x = ""
try:
with open(file_path_x, 'x', encoding='utf-8') as f:
("这是使用 'x' 模式创建并写入的内容。")
print(f"文件 '{file_path_x}' 已独占创建并写入内容。")
# 再次尝试创建,会引发 FileExistsError
with open(file_path_x, 'x', encoding='utf-8') as f:
("这行内容永远不会被写入,因为文件已存在。")
except FileExistsError:
print(f"文件 '{file_path_x}' 已存在,无法使用 'x' 模式独占创建。")
except IOError as e:
print(f"文件操作失败: {e}")
模式 'a':追加模式(在文件末尾添加内容)
当使用 `'a'` 模式打开文件时,如果文件不存在,会创建一个新文件;如果文件已存在,则会将新内容添加到文件末尾,而不会删除原有内容。这对于日志文件或其他需要累积数据的场景非常适用。
# 示例3: 使用 'a' 模式追加内容
file_path_a = ""
try:
with open(file_path_a, 'a', encoding='utf-8') as f:
("这是使用 'a' 模式写入的第一行。")
print(f"文件 '{file_path_a}' 已创建或追加内容。")
with open(file_path_a, 'a', encoding='utf-8') as f:
("这是追加的第二行内容。")
print(f"文件 '{file_path_a}' 再次追加内容。")
except IOError as e:
print(f"文件操作失败: {e}")
2. 写入多行内容
除了 `()` 方法,还可以使用 `()` 方法一次性写入一个字符串列表(每个字符串通常以换行符结束)。
# 示例4: 写入多行内容
file_path_multi = ""
lines_to_write = [
"第一行文本。",
"第二行文本。",
"第三行文本。"
]
try:
with open(file_path_multi, 'w', encoding='utf-8') as f:
(lines_to_write)
print(f"文件 '{file_path_multi}' 已写入多行内容。")
except IOError as e:
print(f"文件操作失败: {e}")
3. 上下文管理器 `with open(...)` 的重要性
在上述所有示例中,我们都使用了 `with open(...) as f:` 结构。这是一个上下文管理器,它确保文件在操作完成后自动关闭,即使在文件操作过程中发生异常也不例外。这极大地简化了代码,并防止了资源泄露(例如,文件句柄未关闭导致的其他程序无法访问文件)。强烈推荐始终使用 `with` 语句进行文件操作。
Python 目录的创建与管理
在组织文件时,目录(文件夹)扮演着至关重要的角色。Python 的 `os` 模块提供了丰富的函数来创建、管理和查询目录。
1. 创建单层目录:`()`
`(path, mode=0o777)` 用于创建单个目录。如果指定路径的父目录不存在,或者目录已存在,则会抛出 `FileNotFoundError` 或 `FileExistsError` 异常。
import os
# 示例5: 创建单层目录
dir_name_single = "my_new_directory"
try:
if not (dir_name_single): # 检查目录是否存在,避免报错
(dir_name_single)
print(f"目录 '{dir_name_single}' 已创建。")
else:
print(f"目录 '{dir_name_single}' 已经存在。")
# 尝试创建已存在的目录,会报错
# (dir_name_single)
except FileExistsError:
print(f"目录 '{dir_name_single}' 已存在。")
except OSError as e:
print(f"创建目录失败: {e}")
2. 创建多层目录:`()`
`(name, mode=0o777, exist_ok=False)` 可以递归地创建多层目录。这意味着,如果父目录不存在,它也会一并创建。`exist_ok=True` 是一个非常有用的参数,当设置为 `True` 时,如果目录已经存在,它不会抛出 `FileExistsError` 异常,而是静默跳过,这在很多场景下非常方便。
# 示例6: 创建多层目录
nested_dir_path = "parent_dir/child_dir/grandchild_dir"
try:
(nested_dir_path, exist_ok=True) # 使用 exist_ok=True
print(f"多层目录 '{nested_dir_path}' 已创建 (或已存在)。")
# 再次创建已存在的目录,由于 exist_ok=True 不会报错
(nested_dir_path, exist_ok=True)
print(f"再次尝试创建 '{nested_dir_path}',由于 exist_ok=True 未报错。")
except OSError as e:
print(f"创建多层目录失败: {e}")
Python 文件与目录的删除
删除文件和目录是文件管理的重要组成部分。同样,`os` 模块和 `shutil` 模块提供了相应的功能。
1. 删除文件:`()` 或 `()`
`(path)` 和 `(path)` 都是用于删除指定路径的文件。它们是等价的。如果文件不存在,会抛出 `FileNotFoundError` ;如果路径指向的是一个目录而不是文件,会抛出 `IsADirectoryError`。
# 示例7: 删除文件
file_to_delete = ""
# 先创建这个文件以便删除
with open(file_to_delete, 'w') as f:
("准备删除的文件内容。")
print(f"文件 '{file_to_delete}' 已创建,准备删除。")
try:
if (file_to_delete):
(file_to_delete) # 或者 (file_to_delete)
print(f"文件 '{file_to_delete}' 已成功删除。")
else:
print(f"文件 '{file_to_delete}' 不存在,无需删除。")
# 尝试删除不存在的文件,会引发 FileNotFoundError
("")
except FileNotFoundError:
print("尝试删除不存在的文件,引发 FileNotFoundError。")
except IsADirectoryError:
print("尝试删除目录而非文件,引发 IsADirectoryError。")
except PermissionError:
print("没有删除文件的权限,引发 PermissionError。")
except OSError as e:
print(f"删除文件失败: {e}")
2. 删除空目录:`()`
`(path)` 用于删除空的目录。如果目录不为空,或者路径指向的不是目录,则会抛出 `OSError`。
# 示例8: 删除空目录
empty_dir_to_delete = "empty_test_dir"
(empty_dir_to_delete, exist_ok=True)
print(f"目录 '{empty_dir_to_delete}' 已创建,准备删除。")
try:
if (empty_dir_to_delete):
(empty_dir_to_delete)
print(f"空目录 '{empty_dir_to_delete}' 已成功删除。")
else:
print(f"路径 '{empty_dir_to_delete}' 不是一个目录或不存在。")
# 尝试删除不存在的目录
# ("non_existent_empty_dir")
# 尝试删除非空目录,会报错
# ("non_empty_dir/file_inside", exist_ok=True)
# with open("non_empty_dir/file_inside/", 'w') as f:
# ("content")
# ("non_empty_dir")
except FileNotFoundError:
print("尝试删除不存在的目录,引发 FileNotFoundError。")
except OSError as e: # 捕获删除非空目录的错误
print(f"删除目录失败 (可能目录不为空): {e}")
3. 删除非空目录:`()`
当需要删除包含文件和子目录的非空目录时,`()` 将无法胜任。这时需要使用 `shutil` 模块中的 `()` 函数。请务必谨慎使用此函数,因为它会递归删除指定路径下的所有内容,且不可恢复!
import shutil
# 示例9: 删除非空目录
non_empty_dir_to_delete = "parent_dir_to_delete"
# 先创建包含内容的目录
((non_empty_dir_to_delete, "sub_dir"), exist_ok=True)
with open((non_empty_dir_to_delete, ""), 'w') as f:
("file content")
with open((non_empty_dir_to_delete, "sub_dir", ""), 'w') as f:
("another file content")
print(f"非空目录 '{non_empty_dir_to_delete}' 及其内容已创建,准备删除。")
try:
if (non_empty_dir_to_delete):
(non_empty_dir_to_delete)
print(f"非空目录 '{non_empty_dir_to_delete}' 及其所有内容已成功删除。")
else:
print(f"目录 '{non_empty_dir_to_delete}' 不存在,无需删除。")
except OSError as e:
print(f"删除非空目录失败: {e}")
最佳实践与注意事项
进行文件和目录操作时,遵循一些最佳实践可以帮助我们编写出更健壮、更可靠的代码。
1. 总是进行错误处理
文件操作是容易出错的,例如文件不存在、权限不足、磁盘空间不足等。使用 `try...except` 块来捕获和处理这些异常至关重要。常见的异常包括 `FileNotFoundError`、`FileExistsError`、`PermissionError`、`OSError` 等。
2. 使用 `()` 构建路径
不同的操作系统使用不同的路径分隔符(Windows 是 `\`,Linux/macOS 是 `/`)。直接拼接字符串可能导致跨平台兼容性问题。`()` 会根据当前操作系统的规则自动拼接路径,确保代码的可移植性。
# 示例10: 使用 构建路径
base_dir = "data"
sub_dir = "logs"
file_name = ""
full_path = (base_dir, sub_dir, file_name)
print(f"构建的完整路径: {full_path}")
3. 检查文件或目录是否存在
在进行删除操作前,通常会先检查文件或目录是否存在,以避免 `FileNotFoundError` 或 `OSError`。`(path)`、`(path)` 和 `(path)` 是常用的检查函数。
# 示例11: 检查文件或目录是否存在
file_to_check = ""
dir_to_check = "my_new_directory"
print(f"'{file_to_check}' 是否存在: {(file_to_check)}")
print(f"'{file_to_check}' 是否是文件: {(file_to_check)}")
print(f"'{dir_to_check}' 是否是目录: {(dir_to_check)}")
现代化文件操作:`pathlib` 模块
Python 3.4 引入了 `pathlib` 模块,它提供了一种更现代、更面向对象的方式来处理文件系统路径。`pathlib` 将路径视为对象,通过方法链式调用来执行操作,使得代码更具可读性和直观性。
1. `Path` 对象的创建
`Path` 对象可以表示文件或目录的路径。
from pathlib import Path
# 示例12: 创建 Path 对象
current_dir = Path('.') # 当前目录
my_file = Path('my_data/') # 相对路径
abs_path = Path('/home/user/documents/') # 绝对路径
print(f"当前目录 Path 对象: {current_dir}")
print(f"相对文件 Path 对象: {my_file}")
print(f"绝对文件 Path 对象: {abs_path}")
# 路径拼接
combined_path = current_dir / 'new_folder' / ''
print(f"Path 对象拼接路径: {combined_path}")
2. `pathlib` 文件与目录的创建
创建文件:`.touch()` 和 `.write_text()` / `.write_bytes()`
`.touch()` 方法可以创建一个空文件,如果文件已存在,则会更新其修改时间。`.write_text()` 用于写入文本内容,`.write_bytes()` 用于写入二进制内容。
# 示例13: pathlib 创建文件
file_path_pl = Path("")
file_path_pl_touch = Path("")
try:
# 使用 .write_text() 创建并写入
file_path_pl.write_text("这是通过 pathlib 写入的文本内容。第二行内容。")
print(f"文件 '{file_path_pl}' 已通过 pathlib 创建并写入。")
# 使用 .touch() 创建空文件
(exist_ok=True) # exist_ok=True 避免文件存在时报错
print(f"空文件 '{file_path_pl_touch}' 已通过 pathlib 创建。")
except IOError as e:
print(f"pathlib 文件创建失败: {e}")
创建目录:`.mkdir()`
`.mkdir()` 方法可以创建目录。`parents=True` 类似于 `()` 的递归创建,`exist_ok=True` 避免已存在时报错。
# 示例14: pathlib 创建目录
dir_path_pl = Path("pathlib_dir/sub_dir")
try:
(parents=True, exist_ok=True)
print(f"目录 '{dir_path_pl}' 已通过 pathlib 创建。")
except IOError as e:
print(f"pathlib 目录创建失败: {e}")
3. `pathlib` 文件与目录的删除
删除文件:`.unlink()`
`.unlink()` 方法用于删除文件。如果文件不存在,会引发 `FileNotFoundError`。
# 示例15: pathlib 删除文件
file_to_delete_pl = Path("")
file_to_delete_pl.write_text("删除我!") # 先创建文件
try:
if () and file_to_delete_pl.is_file():
()
print(f"文件 '{file_to_delete_pl}' 已通过 pathlib 删除。")
else:
print(f"文件 '{file_to_delete_pl}' 不存在或不是文件。")
# 尝试删除不存在的文件
# Path("").unlink()
except FileNotFoundError:
print("尝试删除不存在的文件,引发 FileNotFoundError。")
except OSError as e:
print(f"pathlib 删除文件失败: {e}")
删除空目录:`.rmdir()`
`.rmdir()` 方法用于删除空目录。如果目录不为空,会引发 `OSError`。
# 示例16: pathlib 删除空目录
empty_dir_to_delete_pl = Path("pathlib_empty_dir_delete")
(exist_ok=True)
try:
if () and empty_dir_to_delete_pl.is_dir():
()
print(f"空目录 '{empty_dir_to_delete_pl}' 已通过 pathlib 删除。")
else:
print(f"目录 '{empty_dir_to_delete_pl}' 不存在或不为空。")
except OSError as e:
print(f"pathlib 删除空目录失败 (可能不为空): {e}")
删除非空目录(结合 ``)
`pathlib` 本身没有直接删除非空目录的方法,但可以与 `()` 结合使用。
# 示例17: pathlib 删除非空目录(结合 shutil)
non_empty_dir_to_delete_pl = Path("pathlib_non_empty_dir_delete")
(non_empty_dir_to_delete_pl / "sub").mkdir(parents=True, exist_ok=True)
(non_empty_dir_to_delete_pl / "").write_text("content")
try:
if () and non_empty_dir_to_delete_pl.is_dir():
(non_empty_dir_to_delete_pl) # 注意这里是
print(f"非空目录 '{non_empty_dir_to_delete_pl}' 及其内容已通过 shutil 删除。")
else:
print(f"目录 '{non_empty_dir_to_delete_pl}' 不存在。")
except OSError as e:
print(f"pathlib 结合 shutil 删除非空目录失败: {e}")
总结与展望
本文全面探讨了 Python 中文件和目录的创建、写入与删除操作。从基础的 `os` 模块,到方便处理非空目录的 `shutil` 模块,再到现代化的 `pathlib` 模块,我们了解了每种工具的用法、特点以及它们在不同场景下的适用性。
核心要点回顾:
使用 `open()` 函数以 'w' (覆盖), 'x' (独占创建), 'a' (追加) 模式进行文件写入。
始终使用 `with open(...)` 上下文管理器,确保文件资源得到正确管理。
`()` 创建单层目录,`()` 递归创建多层目录 (推荐使用 `exist_ok=True`)。
`()` 或 `()` 删除文件,`()` 删除空目录。
`()` 递归删除非空目录,使用时务必谨慎。
`try...except` 块是处理文件操作中可能发生的错误的关键。
`()` 用于构建跨平台兼容的路径。
`pathlib` 模块提供面向对象的路径操作,使代码更清晰、更 Pythonic。它的 `.touch()`、`.write_text()`、`.mkdir()`、`.unlink()`、`.rmdir()` 等方法极大简化了代码。
掌握这些文件和目录操作技巧,将使您能够更自信、更高效地编写 Python 应用程序。在实际开发中,根据项目的需求和团队的编码规范,选择最合适的模块和方法,并始终将错误处理和资源管理放在首位,是构建健壮系统的基石。
2025-10-22

PHP无需数据库:高性能、轻量级动态内容输出全攻略
https://www.shuihudhg.cn/130796.html

精通Python数据与数据结构:构建高效代码的基石
https://www.shuihudhg.cn/130795.html

Python数据预处理实战:数据挖掘成功的关键步骤与常用技术详解
https://www.shuihudhg.cn/130794.html

深入理解Java类与方法的调用机制:从基础到高级实践
https://www.shuihudhg.cn/130793.html

Java文件改名方法详解:从基础到IDE智能重构与编程实践
https://www.shuihudhg.cn/130792.html
热门文章

Python 格式化字符串
https://www.shuihudhg.cn/1272.html

Python 函数库:强大的工具箱,提升编程效率
https://www.shuihudhg.cn/3366.html

Python向CSV文件写入数据
https://www.shuihudhg.cn/372.html

Python 静态代码分析:提升代码质量的利器
https://www.shuihudhg.cn/4753.html

Python 文件名命名规范:最佳实践
https://www.shuihudhg.cn/5836.html