13.1 文件打开与关闭
在Python中处理文件的第一步就是打开文件,这就像你去图书馆借书一样,得先找到书才能看。Python使用内置的open()函数来打开文件,这个函数会返回一个文件对象,通过这个对象我们就能对文件进行各种操作了。
推荐的最佳实践
使用 with 语句自动管理文件关闭,这是现代 Python 编程的标准做法。
# 推荐的最佳实践:使用 with 自动管理文件关闭
with open('example.txt', 'r', encoding='utf-8') as f:
content = f.read()
print(content)
# 离开 with 块后,文件自动关闭,即使发生异常也不例外。| 功能名称 | 调用方法 | 具体功能与注意事项 |
|---|---|---|
| 打开文件 | open(filename, mode) | filename是文件路径,mode是打开模式('r'读、'w'写、'a'追加等),默认'r' |
| 自动关闭 | with open(...) as f: | 推荐使用 with 语句,确保文件在使用后自动关闭,避免资源泄露 |
# 完整的文件打开和关闭示例(使用 with 语句)
try:
# 尝试打开文件进行读取
with open('data.txt', 'r', encoding='utf-8') as file:
content = file.read()
print("文件内容:")
print(content)
# 文件在这里已经自动关闭
except FileNotFoundError:
# 如果文件不存在,捕获异常
print("文件未找到!")
except IOError:
# 处理其他IO错误
print("文件操作出错!")需要注意的是,open()函数的第二个参数是模式参数,常用的有:
- 'r': 只读模式(默认)
- 'w': 写入模式(会覆盖原有内容)
- 'a': 追加模式(在文件末尾添加内容)
- 'rb', 'wb': 二进制模式
重要提示: 始终使用 with 语句来管理文件,这样可以确保即使在发生异常时文件也能被正确关闭。
13.2 pathlib 路径处理
Python 3.4 引入了 pathlib 模块,提供了面向对象的方式来处理文件路径。相比传统的 os.path,pathlib 更加直观、跨平台,并且代码更简洁。
from pathlib import Path
# 创建路径对象
data_dir = Path('data')
file_path = data_dir / 'example.txt'
# 检查是否存在
if file_path.exists():
with file_path.open('r', encoding='utf-8') as f:
print(f.read())
else:
print("文件不存在")常用 pathlib 操作:
| 功能名称 | 调用方法 | 具体功能与注意事项 |
|---|---|---|
| 创建路径对象 | Path('path/to/file') | 创建 Path 对象,支持 / 运算符拼接路径 |
| 检查存在性 | path.exists() | 检查文件或目录是否存在 |
| 获取父目录 | path.parent | 返回父目录的 Path 对象 |
| 获取文件名 | path.name | 返回文件名(含扩展名) |
| 获取扩展名 | path.suffix | 返回文件扩展名(如 .txt) |
| 创建目录 | path.mkdir(parents=True) | 创建目录,parents=True 表示递归创建父目录 |
| 遍历目录 | path.iterdir() | 返回目录中所有文件和子目录的迭代器 |
from pathlib import Path
# 更多 pathlib 示例
# 获取当前工作目录
current_dir = Path.cwd()
print(f"当前目录: {current_dir}")
# 构建路径(使用 / 运算符,跨平台兼容)
config_file = current_dir / 'config' / 'settings.json'
print(f"配置文件路径: {config_file}")
# 获取路径信息
print(f"文件名: {config_file.name}") # settings.json
print(f"父目录: {config_file.parent}") # .../config
print(f"扩展名: {config_file.suffix}") # .json
print(f" stem (不含扩展名): {config_file.stem}") # settings
# 检查路径类型
if config_file.exists():
if config_file.is_file():
print("这是一个文件")
elif config_file.is_dir():
print("这是一个目录")
# 创建目录(如果不存在)
new_dir = Path('data/output')
new_dir.mkdir(parents=True, exist_ok=True)
print(f"目录已创建或已存在: {new_dir}")建议
对于新项目,建议优先使用 pathlib 而不是 os.path。它提供了更 Pythonic 的 API,代码更易读且不易出错。
13.3 文本文件读写操作
既然我们已经学会了如何打开和关闭文件,接下来就要学习如何真正地读写文件内容了。Python提供了多种方法来处理文本文件,让我们能够轻松地与文件进行交互。
# 读取整个文件内容
file = open('example.txt', 'r')
content = file.read() # 读取全部内容
print(content)
file.close()
# 逐行读取文件
file = open('example.txt', 'r')
line = file.readline() # 读取一行
print(line)
file.close()
# 读取所有行到列表
file = open('example.txt', 'r')
lines = file.readlines() # 读取所有行,返回列表
print(lines)
file.close()写入文件也同样简单:
# 写入文件内容
file = open('output.txt', 'w')
file.write("Hello, World!\n") # 写入字符串
file.write("这是第二行\n")
file.close()| 功能名称 | 调用方法 | 具体功能与注意事项 |
|---|---|---|
| 读取全部内容 | file.read() | 返回整个文件内容作为字符串,注意大文件可能占用大量内存 |
| 读取单行 | file.readline() | 返回下一行内容,包含换行符,到达文件末尾返回空字符串 |
| 读取所有行 | file.readlines() | 返回包含所有行的列表,每行包含换行符 |
| 写入内容 | file.write(string) | 写入字符串到文件,返回写入的字符数 |
# 完整的文件读写示例
try:
# 写入文件
write_file = open('test.txt', 'w')
write_file.write("第一行内容\n")
write_file.write("第二行内容\n")
write_file.write("第三行内容\n")
write_file.close()
# 读取文件
read_file = open('test.txt', 'r')
content = read_file.read()
print("文件内容:")
print(content)
read_file.close()
except IOError as e:
print(f"文件操作错误: {e}")
except Exception as e:
print(f"未知错误: {e}")读写操作时要注意编码问题,特别是处理中文内容时。可以在open()函数中指定编码参数,比如open('file.txt', 'r', encoding='utf-8')。
13.4 with 语句自动管理文件
虽然我们知道了要手动关闭文件,但有时候可能会忘记,或者在文件操作过程中发生异常导致close()没有被执行。这时候Python的with语句就派上用场了,它能自动帮我们管理文件的打开和关闭。
# 使用with语句打开文件
with open('example.txt', 'r') as file:
content = file.read()
print(content)
# 文件在这里自动关闭,即使发生异常也会关闭with语句的好处是无论代码块中是否发生异常,文件都会被自动关闭。这大大简化了我们的代码,也避免了资源泄露的问题。
| 功能名称 | 调用方法 | 具体功能与注意事项 |
|---|---|---|
| 自动管理文件 | with open(filename, mode) as file: | 自动处理文件的打开和关闭,即使发生异常也会确保文件被关闭 |
| 嵌套with语句 | with open(file1) as f1, open(file2) as f2: | 同时管理多个文件,Python 2.7+和3.1+支持 |
# 使用with语句的完整示例
try:
# 写入文件
with open('data.txt', 'w', encoding='utf-8') as write_file:
write_file.write("使用with语句写入文件\n")
write_file.write("不用担心忘记关闭文件\n")
print("文件写入完成")
# 读取文件
with open('data.txt', 'r', encoding='utf-8') as read_file:
content = read_file.read()
print("读取的文件内容:")
print(content)
except FileNotFoundError:
print("文件未找到")
except PermissionError:
print("没有权限访问文件")
except UnicodeDecodeError:
print("文件编码错误")
except Exception as e:
print(f"发生未知错误: {e}")使用with语句不仅代码更简洁,而且更加安全可靠。这是Python中处理文件的推荐方式,也是现代Python编程的最佳实践之一。
13.5 简单路径操作
在实际开发中,我们经常需要处理文件路径,比如获取当前工作目录、构建文件路径、检查文件是否存在等。Python的os模块和pathlib模块提供了丰富的路径操作功能。
import os
from pathlib import Path
# 获取当前工作目录
current_dir = os.getcwd()
print(f"当前工作目录: {current_dir}")
# 构建文件路径(跨平台兼容)
file_path = os.path.join(current_dir, 'data', 'example.txt')
print(f"文件路径: {file_path}")
# 使用pathlib(Python 3.4+推荐方式)
current_path = Path.cwd()
data_file = current_path / 'data' / 'example.txt'
print(f"使用pathlib的路径: {data_file}")路径操作对于编写跨平台的程序非常重要,因为Windows使用反斜杠\,而Linux和macOS使用正斜杠/。
| 功能名称 | 调用方法 | 具体功能与注意事项 |
|---|---|---|
| 获取当前目录 | os.getcwd() 或 Path.cwd() | 返回当前工作目录的绝对路径 |
| 路径拼接 | os.path.join() 或 Path / 'subdir' | 安全地拼接路径组件,自动处理路径分隔符 |
| 检查文件存在 | os.path.exists(path) 或 Path(path).exists() | 检查路径是否存在 |
| 创建目录 | os.makedirs(path) 或 Path(path).mkdir(parents=True) | 创建目录,包括父目录 |
import os
from pathlib import Path
try:
# 使用os模块进行路径操作
current_dir = os.getcwd()
data_dir = os.path.join(current_dir, 'my_data')
# 检查目录是否存在,不存在则创建
if not os.path.exists(data_dir):
os.makedirs(data_dir)
print(f"创建目录: {data_dir}")
# 创建文件路径
file_path = os.path.join(data_dir, 'sample.txt')
# 写入文件
with open(file_path, 'w', encoding='utf-8') as f:
f.write("这是通过路径操作创建的文件\n")
# 使用pathlib进行同样的操作
current_path = Path.cwd()
new_data_dir = current_path / 'new_data'
# 创建目录(如果不存在)
new_data_dir.mkdir(exist_ok=True)
new_file_path = new_data_dir / 'new_sample.txt'
# 写入新文件
with new_file_path.open('w', encoding='utf-8') as f:
f.write("这是使用pathlib创建的文件\n")
print("路径操作完成!")
except OSError as e:
print(f"操作系统错误: {e}")
except PermissionError:
print("权限不足,无法创建目录或文件")
except Exception as e:
print(f"发生错误: {e}")pathlib是Python 3.4引入的新模块,提供了面向对象的路径操作方式,比传统的os.path更加直观和易用。对于新项目,建议优先使用pathlib。