Skip to content

13.1 文件打开与关闭

在Python中处理文件的第一步就是打开文件,这就像你去图书馆借书一样,得先找到书才能看。Python使用内置的open()函数来打开文件,这个函数会返回一个文件对象,通过这个对象我们就能对文件进行各种操作了。

推荐的最佳实践

使用 with 语句自动管理文件关闭,这是现代 Python 编程的标准做法。

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 语句,确保文件在使用后自动关闭,避免资源泄露
python
# 完整的文件打开和关闭示例(使用 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.pathpathlib 更加直观、跨平台,并且代码更简洁。

python
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()返回目录中所有文件和子目录的迭代器
python
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提供了多种方法来处理文本文件,让我们能够轻松地与文件进行交互。

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()

写入文件也同样简单:

python
# 写入文件内容
file = open('output.txt', 'w')
file.write("Hello, World!\n")  # 写入字符串
file.write("这是第二行\n")
file.close()
功能名称调用方法具体功能与注意事项
读取全部内容file.read()返回整个文件内容作为字符串,注意大文件可能占用大量内存
读取单行file.readline()返回下一行内容,包含换行符,到达文件末尾返回空字符串
读取所有行file.readlines()返回包含所有行的列表,每行包含换行符
写入内容file.write(string)写入字符串到文件,返回写入的字符数
python
# 完整的文件读写示例
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语句就派上用场了,它能自动帮我们管理文件的打开和关闭。

python
# 使用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+支持
python
# 使用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模块提供了丰富的路径操作功能。

python
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)创建目录,包括父目录
python
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