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:给打开的文件起个名字 fwith:代码块结束后自动关闭文件,不用操心忘关的问题\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} 元")
多运行几次,你会发现之前的记录都还在——这就是文件的意义。
练习
- 把列表
["苹果", "香蕉", "橘子"]写入fruits.txt,一行一个。 - 再写一个程序读取
fruits.txt,输出"第 1 行:苹果"这样的格式。 - 写一个"名言收藏器":每次运行让用户输入一句话追加到
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 异常处理