跳至主要内容

Python 写入文件:如何安全地处理文本、CSV 和 JSON 文件

学习如何使用内置工具在 Python 中写入文件,掌握适用于真实应用的常见模式与最佳实践。
· 7分钟 阅读

使用 AI 探索

在某个阶段,每个 Python 程序都需要保存一些内容:日志、结果、用户输入、配置文件或处理后的数据。您可能在导出分析结果、记录脚本执行过程,或在多次运行之间持久化应用状态。无论是哪种情况,写入文件都是您会反复用到的核心 Python 技能。

在本指南中,您将学习如何使用标准库在 Python 中写入文件。我们将从基础开始,然后依次介绍文件模式、编码、JSON 和 CSV 等结构化格式,以及让代码更安全、更可预测的生产级模式。读完后,您将不仅能在玩具示例里,还能在真实应用中自如地写入文件。

如果您已熟悉 Python 基础,本教程将帮助您从脚本迈向专业级文件处理。如果您希望在学习过程中巩固基础,我们的Introduction to Python 和 Intermediate Python  课程与本教程相得益彰。

入门:您的第一个 Python 文件写入

理解 Python 写文件的最快方式就是动手做。让我们从最简单的示例开始,再逐步扩展。

基本模式(逐步讲解)

从本质上讲,写入文件遵循一个简单的模式:

  1. 打开文件
  2. 向其中写入内容
  3. 关闭文件

Python 提供内置的 open() 函数来处理第一步。

open() 函数,浅显解释

open() 函数将您的 Python 代码与磁盘上的文件连接起来。您需要告诉它两件事:

  • 您要处理哪个文件
  • 您想如何处理它

用于写入时,最常见的模式是 "w",表示写。如果文件不存在,Python 会创建它;如果已存在,Python 会将其覆盖。

file = open("example.txt", "w")
file.write("Hello, world!")
file.close()

运行该脚本,Python 会在与您的代码相同的目录中创建一个名为 example.txt 的文件。

那么刚才发生了什么?

  • open("example.txt", "w") 打开或创建文件

  • write() 将文本写入文件

  • close() 刷新数据并释放文件

这能用,但不是长期写文件的推荐方式。

Python 的正确方式:使用上下文管理器

手动打开和关闭文件既容易忘记,也容易出错。这就是 Python 鼓励使用上下文管理器的原因。

为什么用 with 更好:使用 with 可以确保即使在写入过程中出问题,文件也能被正确关闭。它让您的代码更安全、更易读。

with open("example.txt", "w") as file:
    file.write("Hello, world!")

一旦 with 代码块结束,Python 会自动关闭文件。这种模式在专业的 Python 代码中随处可见,值得牢记。您将在我们的 Python Programming 技能路径和 Writing Clean Python Code 课程中反复看到它。

一个 Python 写文件的示例

让我们将它应用到稍微更现实的场景。这里我将创建一条每日日志。

from datetime import date

today = date.today().isoformat()

with open("journal.txt", "a", encoding="utf-8") as file:
    file.write(f"{today}: Practiced writing files in Python.\n")

这引入了两个重要概念:

  • 追加模式("a")

  • 编写结构化、可复用的条目

  • 每次运行都会新增一行,而不会删除早先的条目。

理解文件模式:何时使用 w、a、x 和 r+

一旦您会写入文件,最重要的决策就变成了如何打开它。文件模式控制数据是被覆盖、保留还是受到保护。

写入模式(w):从头开始

如果文件不存在,写入模式会创建它;如果存在,则会覆盖它。

with open("report.txt", "w") as file:
    file.write("Daily sales report\n")

当您需要一个干净的起点时使用它。注意,该模式会悄无声息地删除现有数据。

追加模式(a):在不丢失数据的情况下追加

追加模式会将内容添加到文件末尾。

with open("activity.log", "a") as file:
    file.write("User logged in\n")

这非常适合日志和增量记录,也是生产系统中最安全的模式之一。

独占模式(x):安全创建文件

独占模式仅在文件尚不存在时创建文件。

try:
    with open("config.txt", "x") as file:
        file.write("initialized=true")

except FileExistsError:
    print("File already exists.")

这对于覆盖风险较大的安装脚本很有用。

读写模式(r+):修改现有文件

该模式允许读写,但要求文件已存在。

with open("notes.txt", "r+") as file:
    content = file.read()
    file.write("\nNew note added.")

写入发生在当前文件指针位置,因此理解光标移动在此很重要。

那么应该使用哪种模式?这是我的心智指南:

  • 覆盖现有数据 → w

  • 保留数据并追加 → a

  • 防止覆盖 → x

  • 读取并更新同一文件 → r+

用下图强化这一决策过程:

python write to file how to

选择正确的文件模式通常取决于意图:覆盖、追加、保护或修改。

在 Python 中写入不同类型的内容

当您熟练掌握用正确模式打开文件后,接下来的问题是您实际在写什么。

在真实程序中,您并不总是在写一个字符串。您可能在保存列表、导出结果,或处理图像、PDF 等非文本数据。本节将介绍如何安全、高效地将不同类型的内容写入文件。

写入文本和字符串

最简单的情况是写入纯文本。Python 为此提供两种主要方法:write() 和 writelines()。

write() 仅写入您传入的内容,不会自动添加换行。

with open("example.txt", "w") as file:
    file.write("First line\n")
    file.write("Second line\n")

write() vs. writelines()

关键区别很简单:write() 一次写一个字符串,而 writelines() 会按原样写入一个字符串序列;writelines() 不会帮您添加换行,因此每个元素必须已以 \n 结尾。

在实践中,许多开发者仍然更喜欢在循环中使用 write(),因为这样更易读。

lines = ["One\n", "Two\n", "Three\n"]

with open("example.txt", "w") as file:
    file.writelines(lines)

高效写入列表

items = ["apple", "banana", "cherry"]

content = "\n".join(items)

with open("fruits.txt", "w") as file:
    file.write(content)

先拼接再写入可以减少重复的磁盘写操作,这在处理更大数据集时尤为重要。

写入二进制数据

非文本文件需要使用二进制模式("wb")。

binary_data = b"\x89PNG\r\n\x1a\n"

with open("image.bin", "wb") as file:
    file.write(binary_data)

在 Python 中处理编码(为什么文本会“乱码”)

编码问题是最常见、也最令人沮丧的文件处理错误之一。

始终指定 UTF-8

显式指定编码可防止跨平台问题和字符损坏,如下所示:

with open("example.txt", "w", encoding="utf-8") as file:
    file.write("Café, résumé, naïve")

真实世界示例:多语言文本

在这里明确指定可以在后续节省数小时的调试时间。我的意思是:

customers = ["Ana García", "François Dupont", "Miyuki 山田"]

with open("customers.txt", "w", encoding="utf-8") as file:
    for name in customers:
        file.write(name + "\n")

高级 Python 写入技巧

当您熟练掌握在 Python 中写文件后,接下来通常要解决的问题不再是如何写,而是如何安全高效地写。大文件、意外崩溃和性能瓶颈都会引入我们尚未覆盖的边界情况。

用分块写入处理大文件

流式输出可保持较低的内存占用:

def generate_lines():
    for i in range(1_000_000):
        yield f"Line {i}\n"

with open("large.txt", "w", encoding="utf-8") as file:
    for line in generate_lines():
        file.write(line)

原子写入:防止损坏

这里的想法是防止程序在更新中途崩溃导致的部分写入。

import os, tempfile

def atomic_write(path, content):
    with tempfile.NamedTemporaryFile("w", delete=False) as tmp:
        tmp.write(content)
    os.replace(tmp.name, path)

超越文本文件:写入 JSON 和 CSV

一旦您的数据具备结构,纯文本就不再是最佳选择。Python 让写入 JSON 和 CSV 等常见结构化格式变得容易,从而以更便于共享、检查和后续处理的方式存储数据。

写入 JSON

当您处理字典或嵌套数据时,JSON 通常是最自然的写出格式。Python 内置的json 模块会为您完成转换,无需手动格式化字符串。

import json

data = {"id": 1, "name": "Jeremiah"}

with open("user.json", "w", encoding="utf-8") as file:
    json.dump(data, file, indent=2)

写入 CSV

如果您的数据是表格型并且可能会在电子表格或 BI 工具中打开,那么 CSV 更合适。csv 模块可帮助您安全地写入行,而无需担心分隔符或引号。

import csv

rows = [{"id": 1, "name": "Alice"}, {"id": 2, "name": "Bob"}]

with open("users.csv", "w", newline="", encoding="utf-8") as file:
    writer = csv.DictWriter(file, fieldnames=["id", "name"])
    writer.writeheader()
    writer.writerows(rows)

常见的 Python 写文件错误

尽管在 Python 中写文件很直接,但几个小错误往往会引发大多数真实世界的问题。这些问题通常与语法无关,而是源于对资源管理、文件模式或性能选择等细节的忽视。

请记住以下要点。

  • 忘记关闭文件 → 使用 ‘with’

  • 无意覆盖数据 → 仔细检查模式

  • 忽略编码 → 始终指定 UTF-8

  • 低效写入大文件 → 批量或流式输出

这里的大多数错误都来自小疏忽,而非复杂逻辑。

结论

在 Python 中写文件起步简单,但真实世界的程序需要更多考量。在本指南中,您从第一次写文件出发,学会了选择安全的文件模式、正确处理编码、导出结构化数据,并应用可用于生产的模式。

关键在于意图:选择正确的模式,明确指定编码,并在数据重要时采取防御式写入。

Oluseye Jeremiah

作者

Oluseye Jeremiah

专注于人工智能、机器学习与数据科学的技术写作者,擅长将复杂概念讲解得清晰易懂。

FAQs

Python 能异步写文件吗?

可以,使用诸如aiofiles 等库,不过大多数脚本并不需要。

最安全的写入模式是什么?

追加("a")或独占("x"),取决于您的意图。

为什么我的文本变成乱码?

编码不匹配——请始终使用 UTF-8。

我的文件保存在哪里?

相对于脚本的工作目录。

我应该使用 pathlib 吗?

是的,便于更简洁、跨平台的路径处理。

主题