跳到主要内容

7.1 读写文件

程序运行结束后,变量里的数据就全没了。想把数据永久保存,就要写入文件;下次运行再从文件读回来。

写文件

推荐始终使用 with open(...) 的写法:

with open("diary.txt", "w", encoding="utf-8") as f:
f.write("今天开始学 Python 文件操作。\n")
f.write("感觉还挺简单的。\n")

逐个解释:

  • open(文件名, 模式, encoding="utf-8"):打开(或创建)文件
  • "w" 是写入模式(write):文件不存在就创建,存在就清空重写
  • encoding="utf-8":指定编码。写中文必须加这个,否则 Windows 上容易乱码
  • as f:给打开的文件起个名字 f
  • with:代码块结束后自动关闭文件,不用操心忘关的问题
  • \n 是换行符,write 不会自动换行,要自己加

运行后,代码所在文件夹会出现 diary.txt,用记事本打开看看吧。

三种常用模式

模式含义行为
"r"读 read文件不存在会报错(默认模式)
"w"写 write清空重写!原内容会丢失
"a"追加 append在文件末尾续写,原内容保留

⚠️ "w" 模式会清空文件,想保留原内容用 "a"

# 追加模式:每次运行都在后面加一行
with open("diary.txt", "a", encoding="utf-8") as f:
f.write("这是新增的一行。\n")

读文件

# 方式一:整个读成一个字符串
with open("diary.txt", "r", encoding="utf-8") as f:
content = f.read()
print(content)

# 方式二:逐行读取(文件大时更省内存,也更常用)
with open("diary.txt", "r", encoding="utf-8") as f:
for line in f:
print(line.strip()) # strip() 去掉行尾自带的换行符

💡 为什么要 strip():文件里每行末尾有 \n,print 又会换行,不处理就会隔行空一行。

读不存在的文件会报错

with open("不存在.txt", "r", encoding="utf-8") as f: # ❌ FileNotFoundError
...

可以先判断文件是否存在:

import os

if os.path.exists("diary.txt"):
with open("diary.txt", "r", encoding="utf-8") as f:
print(f.read())
else:
print("文件不存在")

(下一章还会学到用异常处理来应对。)

综合例子:简易记账本

# account.py — 运行一次记一笔,数据永久保存
item = input("花了什么钱:")
money = input("金额:")

with open("account.txt", "a", encoding="utf-8") as f:
f.write(f"{item},{money}\n")

# 读出所有记录并算总额
total = 0
print("--- 全部账目 ---")
with open("account.txt", "r", encoding="utf-8") as f:
for line in f:
name, cost = line.strip().split(",")
print(f"{name}{cost} 元")
total += float(cost)

print(f"总支出:{total} 元")

多运行几次,你会发现之前的记录都还在——这就是文件的意义。

练习

  1. 把列表 ["苹果", "香蕉", "橘子"] 写入 fruits.txt,一行一个。
  2. 再写一个程序读取 fruits.txt,输出"第 1 行:苹果"这样的格式。
  3. 写一个"名言收藏器":每次运行让用户输入一句话追加到 quotes.txt,然后显示目前一共收藏了多少句。
点击查看答案
# 1
fruits = ["苹果", "香蕉", "橘子"]
with open("fruits.txt", "w", encoding="utf-8") as f:
for fruit in fruits:
f.write(fruit + "\n")

# 2
with open("fruits.txt", "r", encoding="utf-8") as f:
for i, line in enumerate(f, start=1):
print(f"第 {i} 行:{line.strip()}")

# 3
quote = input("输入一句名言:")
with open("quotes.txt", "a", encoding="utf-8") as f:
f.write(quote + "\n")

with open("quotes.txt", "r", encoding="utf-8") as f:
count = len(f.readlines())
print(f"已收藏 {count} 句")

本章小结

  • 固定句式:with open(文件, 模式, encoding="utf-8") as f:
  • 模式:r 读、w 清空写、a 追加
  • 逐行读用 for line in f,记得 strip()
  • 中文文件永远加 encoding="utf-8"

下一章:8.1 异常处理