文件读写

文件操作基础

Python 提供了内置的 open() 函数来进行文件操作,它返回一个文件对象(也称为文件描述符)。现代操作系统不允许程序直接操作磁盘,所有文件操作都需要通过操作系统提供的接口来完成。

读取文件

基本读取方法

使用 open() 函数以读取模式打开文件:

f = open('/path/to/file.txt', 'r')  # 'r' 表示读取模式

如果文件不存在,会抛出 FileNotFoundError 异常:

try:
    f = open('/path/to/nonexistent.txt', 'r')
except FileNotFoundError as e:
    print(f"文件不存在: {e}")

读取文件内容

成功打开文件后,有多种读取方式:

  1. 一次性读取全部内容

    content = f.read()
  2. 按指定大小读取(适合大文件):

    chunk = f.read(1024)  # 每次读取1024字节
  3. 逐行读取

    line = f.readline()  # 读取一行
  4. 读取所有行到列表

    lines = f.readlines()

安全关闭文件

使用文件后必须关闭以释放系统资源:

f.close()

推荐使用 with 语句自动管理文件关闭:

with open('/path/to/file.txt', 'r') as f:
    content = f.read()
    # 文件会在代码块结束后自动关闭

文件对象类型

Python 中有多种文件对象类型:

  1. 文本文件(默认):

    open('file.txt', 'r')  # 文本模式
  2. 二进制文件

    open('image.jpg', 'rb')  # 二进制模式
  3. 内存文件(file-like 对象):

    from io import StringIO, BytesIO
    
    # 内存中的文本文件
    text_stream = StringIO("一些文本内容")
    
    # 内存中的二进制文件
    binary_stream = BytesIO(b'\x00\x01\x02')

处理不同编码

对于非 UTF-8 编码的文本文件,需要指定编码:

# 读取GBK编码文件
with open('gbk_file.txt', 'r', encoding='gbk') as f:
    content = f.read()

# 处理编码错误(忽略非法字符)
with open('file.txt', 'r', encoding='utf-8', errors='ignore') as f:
    content = f.read()

常见编码参数:

  • encoding='utf-8'(默认)
  • encoding='gbk'
  • encoding='latin-1'

写入文件

基本写入方法

# 覆盖写入
with open('output.txt', 'w') as f:
    f.write('Hello, World!')

# 追加写入
with open('output.txt', 'a') as f:
    f.write('\nAnother line')

写入多行内容

lines = ['第一行', '第二行', '第三行']

with open('output.txt', 'w') as f:
    for line in lines:
        f.write(f"{line}\n")
    
    # 或者使用 writelines
    f.writelines(f"{line}\n" for line in lines)

文件模式总结

模式描述
'r'读取(默认)
'w'写入(覆盖)
'x'独占创建(文件存在则失败)
'a'追加
'b'二进制模式
't'文本模式(默认)
'+'更新(读写)

组合示例:

  • 'rb':二进制读取
  • 'w+':读写(覆盖)
  • 'a+':读写(追加)

最佳实践

  1. 总是使用 with 语句

    with open('file.txt', 'r') as f:
        # 操作文件
  2. 处理大文件时使用迭代

    with open('large_file.txt', 'r') as f:
        for line in f:  # 逐行读取,内存友好
            process(line)
  3. 明确指定文件编码

    with open('file.txt', 'r', encoding='utf-8') as f:
        content = f.read()
  4. 检查文件是否存在

    import os
    
    if os.path.exists('file.txt'):
        with open('file.txt', 'r') as f:
            content = f.read()
    else:
        print("文件不存在")

示例练习

读取并打印系统时区文件:

fpath = '/etc/timezone'

try:
    with open(fpath, 'r') as f:
        print(f.read())
except FileNotFoundError:
    print("时区文件不存在")
except PermissionError:
    print("没有权限读取时区文件")

总结

Python 文件操作要点:

  1. 使用 open() 函数获取文件对象
  2. 读写操作通过文件对象方法完成
  3. 始终使用 with 语句确保文件正确关闭
  4. 明确指定文件编码以避免问题
  5. 根据需求选择合适的读写模式和方式

通过掌握这些文件操作技巧,你可以高效地处理各种文件IO任务。