文件与目录操作|第七部分:Python标准库精选 (The Standard Library)
欢迎来到Python的“瑞士军刀”——标准库的世界!Python之所以如此强大和受欢迎,一个重要原因就是它“自带电池 (batteries included)”的设计哲学。这意味着,安装完Python后,你就立即拥有了一个功能极其丰富的工具集,无需额外安装就能处理文件、操作目录、网络通信、日期时间等等。
本章,我们将从与计算机交互最基本的操作开始:文件与目录操作。几乎所有的应用程序都需要读取或写入数据,无论是保存用户配置、处理日志文件,还是分析数据集。
我们将学习:
- 如何像翻书一样,优雅地读取和写入文件内容。
- 为什么
with
语句是处理文件的“黄金标准”。 - 如何使用
os
和os.path
模块,像一个系统管理员一样,轻松地创建目录、遍历文件、管理路径。
掌握了这些,你就打通了程序与计算机文件系统之间的“任督二脉”,为后续的数据处理和应用开发奠定了坚实的基础。
16.1 文件读写 (open()
, read()
, write()
, with
语句)
在Python中,与文件交互的核心是内置的 open()
函数。它会返回一个文件对象,然后我们就可以通过这个对象的方法来进行读写操作。
open()
函数的基本语法:
open(file, mode='r', encoding=None)
file
: 文件的路径(可以是相对路径或绝对路径)。mode
: 打开文件的模式,这是最重要的参数之一。'r'
: 读模式 (Read)。默认模式。如果文件不存在,会报错。'w'
: 写模式 (Write)。如果文件存在,会覆盖全部内容;如果文件不存在,会创建新文件。'a'
: 追加模式 (Append)。如果文件存在,在文件末尾追加内容;如果文件不存在,会创建新文件。'b'
: 二进制模式 (Binary)。与r
,w
,a
结合使用(如'rb'
,'wb'
),用于读写非文本文件,如图片、视频。'+'
: 读写模式。与r
,w
,a
结合使用(如'r+'
,'w+'
),增加读或写的能力。
encoding
: 文件的编码格式。在处理文本文件时,强烈建议总是明确指定它,最常用的是'utf-8'
,以避免在不同操作系统上出现乱码问题。
黄金实践:使用 with
语句
with
语句(上下文管理器)是处理文件的最佳方式。它能确保无论代码块中发生什么(即使是异常),文件最终都会被自动、安全地关闭。
# --- 1. 写入文件 ---
# 使用 'w' 模式,如果文件已存在,内容会被清空
try:
with open("my_diary.txt", "w", encoding="utf-8") as f:
f.write("今天天气真好!\n")
f.write("我学习了Python文件操作。\n")
# f.writelines(["一行\n", "又一行\n"]) # writelines 可以写入一个字符串列表
# --- 2. 追加内容到文件 ---
with open("my_diary.txt", "a", encoding="utf-8") as f:
f.write("希望明天也能坚持学习!\n")
# --- 3. 读取整个文件 ---
print("--- 读取全部内容 ---")
with open("my_diary.txt", "r", encoding="utf-8") as f:
content = f.read() # read() 将整个文件内容读入一个字符串
print(content)
# --- 4. 逐行读取文件 (最高效的方式) ---
print("--- 逐行读取 ---")
with open("my_diary.txt", "r", encoding="utf-8") as f:
for line in f: # 文件对象本身就是可迭代的!
print(line.strip()) # .strip() 去除行尾的换行符
except FileNotFoundError:
print("错误:文件未找到!")
except Exception as e:
print(f"发生了未知错误: {e}")
为什么 for line in f:
是最高效的?
因为它使用了迭代器,一次只从文件中读取一行到内存中。相比之下,f.read()
会将整个文件加载到内存,如果文件非常大(几个GB),可能会导致内存耗尽。f.readlines()
也会将所有行读入一个列表,同样有内存问题。
16.2 os
与 os.path
模块:你的文件系统总管
os
模块提供了大量与操作系统交互的功能,而 os.path
子模块则专门用于处理文件路径。它们结合起来,能让你像在命令行中一样自如地操作文件和目录。
常用 os
模块功能:
函数 | 描述 |
---|---|
os.getcwd() |
获取当前工作目录 (Get Current Working Directory) |
os.listdir(path) |
列出指定目录下的所有文件和子目录名 |
os.mkdir(path) |
创建单个目录 |
os.makedirs(path) |
创建多级目录(例如 a/b/c ) |
os.remove(path) |
删除一个文件 |
os.rmdir(path) |
删除一个空目录 |
os.rename(old, new) |
重命名文件或目录 |
os.system(command) |
执行系统命令(如 os.system('cls') 或 os.system('clear') ) |
常用 os.path
模块功能:
函数 | 描述 |
---|---|
os.path.join(path1, path2, ...) |
强烈推荐:智能地拼接路径,会自动处理不同操作系统的路径分隔符 (\ 或 / ) |
os.path.exists(path) |
判断路径是否存在 |
os.path.isfile(path) |
判断路径是否为一个文件 |
os.path.isdir(path) |
判断路径是否为一个目录 |
os.path.abspath(path) |
获取路径的绝对路径 |
os.path.basename(path) |
获取路径中的文件名部分 |
os.path.dirname(path) |
获取路径中的目录部分 |
os.path.split(path) |
将路径分割成 (目录, 文件名) 的元组 |
os.path.splitext(path) |
将路径分割成 (文件名主体, 扩展名) 的元组 |
实战演练:整理下载文件夹
假设我们要写一个脚本,自动将一个名为 downloads
的文件夹中的 .txt
文件移动到一个新建的 documents
目录,将 .jpg
文件移动到 images
目录。
import os
import shutil # shutil 模块提供了更高级的文件操作,如移动、复制
# --- 1. 准备工作 ---
# 定义源目录和目标目录
source_dir = "downloads"
doc_dir = "documents"
img_dir = "images"
# 创建源目录和一些示例文件(如果它们不存在)
if not os.path.exists(source_dir):
os.mkdir(source_dir)
with open(os.path.join(source_dir, "report.txt"), "w") as f: f.write("report")
with open(os.path.join(source_dir, "notes.txt"), "w") as f: f.write("notes")
with open(os.path.join(source_dir, "cat.jpg"), "w") as f: f.write("cat image")
with open(os.path.join(source_dir, "dog.jpg"), "w") as f: f.write("dog image")
with open(os.path.join(source_dir, "script.py"), "w") as f: f.write("python script")
# 创建目标目录(如果它们不存在)
if not os.path.exists(doc_dir):
os.mkdir(doc_dir)
if not os.path.exists(img_dir):
os.mkdir(img_dir)
# --- 2. 核心整理逻辑 ---
# 遍历源目录中的所有文件
for filename in os.listdir(source_dir):
# 使用 os.path.join 来构建完整的文件路径,这是跨平台的最佳实践!
source_path = os.path.join(source_dir, filename)
# 检查是否是文件,而不是子目录
if os.path.isfile(source_path):
# 根据文件扩展名进行分类
if filename.endswith(".txt"):
dest_path = os.path.join(doc_dir, filename)
print(f"正在移动: {source_path} -> {dest_path}")
shutil.move(source_path, dest_path)
elif filename.endswith(".jpg"):
dest_path = os.path.join(img_dir, filename)
print(f"正在移动: {source_path} -> {dest_path}")
shutil.move(source_path, dest_path)
else:
print(f"跳过不支持的文件: {filename}")
print("\n文件整理完毕!")
这个例子综合运用了本章的大部分知识点,展示了如何用Python编写一个实用的小工具来自动化日常的文件管理任务。
太棒了!你现在已经掌握了程序与计算机世界进行信息交换最基本也是最重要的方式。你学会了如何安全、高效地读写文件,并能像使用命令行工具一样自如地管理文件和目录。
这是你利用Python解决现实世界问题的第一步。有了这些基础,我们接下来就可以处理更复杂的数据格式了。在下一章,我们将学习如何处理日期与时间 (datetime
)、如何用正则表达式 (re
) 从文本中提取信息,以及如何处理互联网上最流行的数据交换格式 JSON (json
)。准备好,让你的数据处理能力更上一层楼!