入门:您的第一个 Python 文件写入
理解 Python 写文件的最快方式就是动手做。让我们从最简单的示例开始,再逐步扩展。
基本模式(逐步讲解)
从本质上讲,写入文件遵循一个简单的模式:
- 打开文件
- 向其中写入内容
- 关闭文件
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 中写入不同类型的内容
当您熟练掌握用正确模式打开文件后,接下来的问题是您实际在写什么。
在真实程序中,您并不总是在写一个字符串。您可能在保存列表、导出结果,或处理图像、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 中写文件起步简单,但真实世界的程序需要更多考量。在本指南中,您从第一次写文件出发,学会了选择安全的文件模式、正确处理编码、导出结构化数据,并应用可用于生产的模式。
关键在于意图:选择正确的模式,明确指定编码,并在数据重要时采取防御式写入。

专注于人工智能、机器学习与数据科学的技术写作者,擅长将复杂概念讲解得清晰易懂。
FAQs
Python 能异步写文件吗?
可以,使用诸如aiofiles 等库,不过大多数脚本并不需要。
最安全的写入模式是什么?
追加("a")或独占("x"),取决于您的意图。
为什么我的文本变成乱码?
编码不匹配——请始终使用 UTF-8。
我的文件保存在哪里?
相对于脚本的工作目录。
我应该使用 pathlib 吗?
是的,便于更简洁、跨平台的路径处理。
在某个阶段,每个 Python 程序都需要保存一些内容:日志、结果、用户输入、配置文件或处理后的数据。您可能在导出分析结果、记录脚本执行过程,或在多次运行之间持久化应用状态。无论是哪种情况,写入文件都是您会反复用到的核心 Python 技能。
在本指南中,您将学习如何使用标准库在 Python 中写入文件。我们将从基础开始,然后依次介绍文件模式、编码、JSON 和 CSV 等结构化格式,以及让代码更安全、更可预测的生产级模式。读完后,您将不仅能在玩具示例里,还能在真实应用中自如地写入文件。
如果您已熟悉 Python 基础,本教程将帮助您从脚本迈向专业级文件处理。如果您希望在学习过程中巩固基础,我们的Introduction to Python 和 Intermediate Python 课程与本教程相得益彰。