Python 文件 IO(手把手讲解)

Python 文件 IO 入门:从读写文件开始掌握数据持久化

在编程的世界里,数据就像河流中的水,运行时存在于内存中,一旦程序结束,这些“水”就会消失。而文件 IO,就是把数据“存入水库”的过程。Python 文件 IO 是所有开发者必须掌握的核心技能之一。它不仅让你能读取配置文件、日志记录,还能处理 CSV、JSON 等常见格式,是连接程序与外部世界的重要桥梁。

对初学者来说,文件操作可能显得有些抽象,但其实它就像你每天用的“记事本”——打开、写入、保存、关闭。Python 提供了简洁而强大的 API 来完成这些操作,让复杂变得简单。

本文将带你从零开始,一步步掌握 Python 文件 IO 的核心用法,包括打开文件、读写模式、上下文管理器、异常处理以及常见文件格式的操作。无论你是刚接触 Python,还是想巩固基础,这篇内容都值得收藏。


文件打开与基本操作:理解模式与句柄

在 Python 中,所有文件操作都从 open() 函数开始。它的语法如下:

file_object = open(file_path, mode, encoding)
  • file_path:文件的路径,可以是相对路径(如 data.txt)或绝对路径(如 /home/user/data.txt
  • mode:打开模式,决定文件如何被使用
  • encoding:编码格式,推荐始终指定,避免乱码问题

常见的模式有:

模式 含义
r 只读模式,文件必须存在
w 写入模式,会覆盖原有内容
a 追加模式,在文件末尾添加内容
r+ 读写模式,文件必须存在
w+ 读写模式,会清空原文件内容
a+ 读写追加模式,支持读和追加

💡 小贴士:你可以把文件想象成一本日记。r 是“只读”(看),w 是“重写”(清空后写新内容),a 是“追加”(在最后加新日记)。

示例代码:

file = open("example.txt", "r", encoding="utf-8")

content = file.read()

print(content)

file.close()

⚠️ 注意:open() 返回一个文件对象(也叫句柄),它是一个可迭代的资源。如果不关闭,系统资源可能被占用,导致后续无法访问文件。


读取文件的三种方式:read、readline 与 readlines

Python 提供了多种读取文件内容的方式,每种都有其适用场景。

read():一次性读取全部内容

适合读取小文件,如配置文件、说明文档。

with open("config.txt", "r", encoding="utf-8") as f:
    data = f.read()  # 一次性读取全部文本
    print(data)

✅ 优点:简单直接
❌ 缺点:大文件会占用过多内存

readline():逐行读取

适合处理日志文件或逐行解析的文本。

with open("log.txt", "r", encoding="utf-8") as f:
    line = f.readline()  # 读取第一行
    while line:
        print("处理行:", line.strip())  # strip() 去除换行符
        line = f.readline()  # 继续读下一行

✅ 优点:内存占用小,适合大文件
❌ 缺点:代码稍显冗长

readlines():读取所有行到列表

适合需要对每一行做索引或条件判断的场景。

with open("students.txt", "r", encoding="utf-8") as f:
    lines = f.readlines()  # 返回一个包含所有行的列表

for i, line in enumerate(lines):
    print(f"第 {i+1} 行: {line.strip()}")

✅ 优点:可随机访问某一行
❌ 缺点:大文件可能内存爆掉


写入文件:从创建到覆盖,掌握写入模式

写入文件是数据持久化的关键。根据需求选择合适的模式很重要。

使用 w 模式写入(覆盖)

with open("output.txt", "w", encoding="utf-8") as f:
    f.write("这是第一行\n")        # 写入文本,需手动加换行
    f.write("这是第二行\n")
    f.write("这是第三行")

💡 如果文件不存在,w 模式会自动创建;如果存在,则内容被清空。

使用 a 模式追加内容

with open("log.txt", "a", encoding="utf-8") as f:
    f.write("\n[INFO] 程序启动成功\n")
    f.write("[ERROR] 未找到配置文件\n")

✅ 适合日志记录、数据追加等场景

读写模式 r+ 与 w+

with open("data.txt", "r+", encoding="utf-8") as f:
    content = f.read()
    print("原内容:", content)
    
    # 将光标移到文件开头,写入新内容
    f.seek(0)
    f.write("更新后的第一行\n")
    f.write("第二行\n")

🔍 seek(0) 用于将文件指针移动到开头。seek() 是控制读写位置的关键方法。


上下文管理器 with:自动管理资源,安全可靠

在前面的示例中,我们使用了 with 语句。这是 Python 中处理文件 IO 的最佳实践。

with open("data.txt", "r", encoding="utf-8") as file:
    content = file.read()
    print(content)

✅ 优点:

  • 无论程序是否出错,文件都会被正确关闭
  • 代码更简洁,可读性更强
  • 避免“忘记关闭文件”导致的资源泄漏

重要提醒:永远不要在 with 外部使用文件对象!一旦 with 块结束,文件句柄就被释放。


异常处理:优雅应对文件不存在或权限问题

在真实环境中,文件可能不存在、权限不足、磁盘满等问题。必须进行异常处理。

try:
    with open("nonexistent.txt", "r", encoding="utf-8") as f:
        content = f.read()
        print(content)
except FileNotFoundError:
    print("错误:文件不存在,请检查路径是否正确")
except PermissionError:
    print("错误:没有权限读取该文件")
except Exception as e:
    print(f"发生未知错误:{e}")

🛠 常见异常类型:

  • FileNotFoundError:文件找不到
  • PermissionError:权限不足
  • IsADirectoryError:试图打开目录为文件
  • UnicodeDecodeError:编码不匹配

✅ 建议:所有文件操作都应包裹在 try-except 中,提升程序健壮性。


处理常见文件格式:CSV 与 JSON

实际项目中,你很少直接读写纯文本。更常见的是 CSV 和 JSON 文件。

读写 CSV 文件

import csv

with open("students.csv", "w", encoding="utf-8", newline="") as f:
    writer = csv.writer(f)
    writer.writerow(["姓名", "年龄", "城市"])  # 写入表头
    writer.writerow(["张三", 20, "北京"])
    writer.writerow(["李四", 22, "上海"])

with open("students.csv", "r", encoding="utf-8") as f:
    reader = csv.reader(f)
    for row in reader:
        print(row)  # 输出:['姓名', '年龄', '城市']

💡 newline="" 是必须的,防止写入时出现多余空行。

读写 JSON 文件

import json

data = {
    "name": "小明",
    "age": 25,
    "hobbies": ["读书", "游泳"]
}

with open("user.json", "w", encoding="utf-8") as f:
    json.dump(data, f, ensure_ascii=False, indent=4)
    # ensure_ascii=False 避免中文被转义

with open("user.json", "r", encoding="utf-8") as f:
    loaded_data = json.load(f)
    print(loaded_data["name"])  # 输出:小明

✅ JSON 是结构化数据交换的常用格式,适合配置文件、API 返回数据等。


总结:Python 文件 IO 的核心原则

Python 文件 IO 虽然看似简单,但背后蕴含着资源管理、异常处理、编码规范等重要思想。掌握它,意味着你真正开始与外部世界交互。

  • 使用 with 语句管理文件,避免资源泄漏
  • 明确选择文件模式(r、w、a、r+ 等)
  • 读写时指定 encoding="utf-8",避免乱码
  • 对文件操作进行异常处理,提升程序稳定性
  • 处理结构化数据时,优先使用 csvjson 模块

🎯 最后提醒:Python 文件 IO 不只是“读写”,更是数据持久化、程序间通信的基础能力。多练习,多写代码,你很快就能成为文件操作的高手。

当你能熟练处理各种文件格式,理解文件句柄、编码、异常机制时,你就已经迈出了从“会写代码”到“写好代码”的关键一步。继续加油!