CC++ & Algorithm

文件写入 -- 像在笔记本上写字

困难3
语言版本:C++Python
概述:学会用Python把文字写到文件里,就像在空白的笔记本上写下你的想法。

文件写入——像在笔记本上写字

你有没有过这样的经历?在游戏里打赢了 BOSS,想记下这次胜利的时间;或者想写一篇日记,下次打开还能看到。用 Python 往文件里写内容,就像你拿出一个笔记本,在上面写下你想保存的东西。这样,程序运行完,数据也不会丢失。

文件写入有两种模式,就像你对待笔记本的态度不同:一种是打开一本新本子,把旧的一页撕掉,从头写;另一种是在已经写满的笔记本后面接着写。


两种写入模式:"w""a"

1. 写入模式 "w"(write)

  • 作用:创建一个新文件,或者把一个已有的文件清空,然后从头开始写。
  • 类比:你有一个旧的日记本,你想换一个全新的心情,于是把旧的那一页撕掉(或者直接擦干净),再开始写新内容。
  • 警告:如果文件名和已有文件相同,原来的内容会被完全删除,无法恢复!
# 用 w 模式写一个新文件
with open("notes.txt", "w") as f:   # "w" 表示写入模式
    f.write("今天天气真好!\n")       # 写第一行,\n 表示换行
    f.write("我学会了写文件。\n")     # 写第二行

运行后,notes.txt 里面只有这两行。如果这个文件原来有内容,也会被清空。

2. 追加模式 "a"(append)

  • 作用:在文件的末尾继续添加内容,不会删除原来的内容。
  • 类比:你已经写了一页日记,还想在后面再接一张纸,接着写下去,保留之前的所有回忆。
  • 优点:安全,不会误删数据。
# 用 a 模式在原文件末尾追加
with open("notes.txt", "a") as f:   # "a" 表示追加模式
    f.write("又写了一句。\n")        # 在末尾加一行

原来的两行还在,现在文件变成了三行。每次运行这段代码,都会在最后加一行。


基础写入:write() 和换行符 \n

write() 方法一次只能写一个字符串。注意,它不会自动换行,需要你自己在字符串末尾加上 \n

  • \n 是一个特殊符号,叫做换行符。它就像你在键盘上按了“回车”键,让后面的内容从新的一行开始。
  • 如果不加 \n,所有内容会挤在一行,像这样:
with open("hello.txt", "w") as f:
    f.write("苹果")
    f.write("香蕉")
    f.write("橘子")

打开文件,你会看到:苹果香蕉橘子(全粘在一起)。所以在写每一行时,记得加 \n

with open("hello.txt", "w") as f:
    f.write("苹果\n")
    f.write("香蕉\n")
    f.write("橘子\n")

现在文件里是:

苹果
香蕉
橘子

一次写多行:writelines()

如果你早就准备好了一个列表(比如你列好的购物清单、要写的诗),想一口气全写进去,可以用 writelines() 方法。

  • 注意writelines() 不会自动加换行,你必须自己在每个字符串末尾加上 \n,否则它们会首尾相连。
# 准备一个水果清单
lines = ["苹果\n", "香蕉\n", "橘子\n"]   # 每个后面加换行符
with open("fruits.txt", "w") as f:
    f.writelines(lines)                 # 把列表里所有的行写进去

文件内容:

苹果
香蕉
橘子

如果你忘了加 \n,比如 lines = ["苹果", "香蕉", "橘子"],那么文件里就是 苹果香蕉橘子,完全分不开。


小技巧:用 print() 写入文件

你平时用的 print() 函数也能往文件里写,只要加上 file 参数。这样可以省去手动加 \n 的麻烦,因为 print() 默认会换行。

with open("output.txt", "w") as f:
    print("你好,世界!", file=f)    # 自动加换行
    print("这是第二行。", file=f)

运行后,output.txt 里有两行。用 print() 写文件特别适合输出格式化的内容,比如游戏得分、排行榜等。


文件会自动关闭吗?—— with 语句的作用

每次打开文件后,用完都应该关闭。关闭文件就像合上笔记本,让系统知道你已经写完了。如果忘记关,可能会在程序意外结束时丢失数据。

with open(...) as f: 这种写法,会在代码块结束时自动关闭文件,你不用再手动调用 f.close()。养成用 with 的习惯,是最安全、最方便的。

如果不小心写了 f = open(...) 而没有 with,一定要记得加 f.close()。不过建议直接使用 with


常见错误与避坑指南

错误1:忘记加换行符

# 错误示范
with open("wrong.txt", "w") as f:
    f.write("苹果")
    f.write("香蕉")   # 结果:苹果香蕉挤一起

修正:每个 write 里加 \n,或者用 print(file=f)

错误2:用 "w" 覆盖了重要文件

# 假设你有一个重要的 score.txt 记录你的游戏分数
with open("score.txt", "w") as f:
    f.write("0\n")    # 糟糕,原来存的最高分被清掉了!

解决:在不确定时先用 "a" 追加,或者先备份文件。养成先读后写的习惯。

错误3:文件名写错,导致新建了一个空文件

with open("scor.txt", "w") as f:   # 原意是 score.txt,但写成了 scor.txt
    f.write("100")

解决:仔细检查文件名,或者在运行前用 os.path.exists() 检查文件是否存在。

错误4:中文乱码 如果文件里有中文,打开后看到一堆乱码,通常是因为编码不一致。在 open() 里加上 encoding='utf-8' 可以解决大部分问题。

with open("中文日记.txt", "w", encoding='utf-8') as f:
    f.write("今天很开心。\n")

这样无论在哪台电脑打开,中文都能正常显示。


完整示例:做一个简单的日记本

下面是一个完整的程序,让用户输入内容,每次运行都会在末尾追加diary.txt 里,就像你每天写日记一样。

# 日记本程序:把输入内容追加到文件

print("=== 简单日记本 ===")
message = input("请输入今天发生的事情:")  # 用户输入

with open("diary.txt", "a", encoding='utf-8') as f:  # 追加模式,指定编码
    f.write(message + "\n")                          # 写入内容并换行

print("日记已保存!")

运行之后,查看 diary.txt 文件,你每次输入的内容都会按顺序排好。你可以用记事本打开看看。

如果你想每次保存时也记录日期和时间,可以先用 import datetime 获取当前时间,再一起写进去:

import datetime

now = datetime.datetime.now()
time_str = now.strftime("%Y-%m-%d %H:%M")   # 格式:2025-04-10 14:30

entry = input("写点什么:")

with open("diary.txt", "a", encoding='utf-8') as f:
    f.write(f"[{time_str}] {entry}\n")       # 如:[2025-04-10 14:30] 今天真棒!

print("已保存。")

相关知识指引

  • 文件读取:学会了写,当然还要学会看。试试 open("文件名", "r")read()readlines() 读出内容。
  • 文件路径:如果文件不在当前运行的目录下,需要写完整路径,比如 "C:/我的文档/data.txt",或者用 os 模块处理。
  • 二进制文件:图片、音乐、视频是二进制文件,要用 "wb""ab" 模式写入。
  • with 语句:理解 with 为什么能自动关闭文件,可以把它看作“安全保险”(上下文管理器)。
  • 数据持久化:把程序里的变量保存到文件里(比如游戏进度),下次启动再读出来,就是简单的数据持久化。

现在你已经掌握了文件写入的两种基本模式、靠谱的 with 语句、以及换行符和编码的小窍门。大胆去尝试吧——写个备忘录、记录游戏成绩、甚至写一个自动写故事的小程序!

例题精讲

1单选题

在Python中,使用open()函数打开文件进行写入时,若希望每次写入都覆盖文件原有内容,应使用哪种打开模式?

A'r'
B'w'
C'a'
D'x'
2判断题

使用 with 语句打开文件进行写入时,Python 会自动关闭文件,不需要手动调用 close() 方法。

3填空题
以下代码想把“Hello”和“World”分两行写入文件 output.txt,请补全空缺内容。

with open("output.txt", "w") as f:
    f.write("Hello" + ___)
    f.write("World")
4单选题

要将一个字符串列表 `lines = ["第一行", "第二行", "第三行"]` 中的每个元素作为独立行写入文件,最合适的方法是?

Af.write(lines)
Bf.writelines(lines)
Cf.writeall(lines)
Dfor line in lines: f.write(line)
5填空题
以下代码尝试打开一个不存在的文件 "notes.txt" 进行写入,并写入内容 "Python很有趣"。请补全 open() 函数的参数。

with open("notes.txt", ___) as f:
    f.write("Python很有趣")