第十六课:和电脑“书写”与“阅读” – 文件操作
- 时长: 90 分钟
- 教学目标:
- 理解文件的概念:电脑上用来长期存放数据的地方。
- 知道为什么程序需要文件操作(保存数据、读取数据、和外界交换数据)。
- 学会使用
open()
命令来打开一个文件,并理解打开文件的不同模式(读取 ‘r’,写入 ‘w’,追加 ‘a’)。 - 掌握向文件写入内容的方法(
.write()
)。 - 掌握从文件读取内容的方法(
.read()
,.readline()
,.readlines()
),并理解它们的区别。 - 重要: 学会使用
with open(...) as ...:
语句,这是推荐的文件操作方式,它可以确保文件在使用后被正确关闭。 - 了解文件操作中可能遇到的简单问题(比如文件不存在),以及
with open
如何简化处理。
课程内容
1. 复习与引入 (10 分钟)
- 复习: 快速回顾我们学过的数据结构:列表(存多个有序数据)、字典(存键值对)。这些数据都存在程序的内存里。
- 提出问题: 老师提问:“我们学过的变量、列表、字典,它们里面的数据都存在电脑的内存里。但是,当我们程序运行结束,或者电脑关机再开机后,内存里的数据就全部丢失了。如果我想把我们计算的学生分数、或者写的猜数字游戏的最高纪录、或者我们写的日记永久地保存起来,下次打开程序还能看到,怎么办呢?这些数据不能只放在内存里呀。”
- 引出文件: 这时候,我们就需要把数据写到电脑的硬盘上,写成一个文件。文件就像我们现实中的日记本、相册、书本一样,可以把信息长期保存起来。程序可以通过文件操作(读和写),和这些硬盘上的数据进行交互。
2. 打开文件的大门 – open() 函数 (15 分钟)
- 概念: 在对文件进行读写操作之前,程序必须先“打开”这个文件。使用内置的
open()
函数来完成。 - 语法:
文件对象 = open(文件路径, 模式)
文件路径
: 文件在电脑里的位置和名字。如果是和你的 Python 程序放在同一个文件夹里,直接写文件名就行了,比如"my_diary.txt"
。如果不在同一个文件夹,需要写完整的路径。模式 (mode)
: 告诉 Python 你打开文件是想做什么。这是第二个重要的参数,用字符串表示。
- 常用的模式:
'r'
(read): 读取模式。打开文件只为了读里面的内容。如果文件不存在,会报错。'w'
(write): 写入模式。打开文件是为了写内容。- 如果文件已经存在,里面的原有内容会被清空!
- 如果文件不存在,Python 会为你创建一个新的文件。
'a'
(append): 追加模式。打开文件是为了在文件末尾添加新内容。- 如果文件已经存在,新内容会写在文件最后面,不会覆盖原有内容。
- 如果文件不存在,Python 会为你创建一个新的文件。
- 文件对象:
open()
函数会返回一个“文件对象”,我们可以通过这个对象来对文件进行读写操作。 - 重要!关闭文件: 对文件操作完成后,一定要“关闭”文件,就像用完笔要盖上笔盖、读完书要合上一样。关闭文件可以确保数据被真正地保存到硬盘,并释放电脑的资源。使用文件对象的
.close()
方法。# 老方法:打开文件,操作,然后关闭 # 打开一个文件用于写入 ('w' 模式) my_file = open("hello.txt", "w") # ... 在这里进行文件写入操作 ... print("文件已打开,准备写入...") # 操作完成后,关闭文件 my_file.close() print("文件已关闭。") # 尝试以读取模式打开一个不存在的文件 (会报错) # try: # file_to_read = open("not_exist.txt", "r") # file_to_read.close() # except FileNotFoundError: # print("错误:要读取的文件不存在!")
- 动手实践: 老师演示如何用
'w'
模式打开一个文件,然后立即关闭。 让学生尝试写代码打开一个文件(比如my_data.txt
)用'w'
模式,然后关闭它。 演示尝试用'r'
模式打开一个不存在的文件,看到报错信息。
3. 向文件“写字” – 写入文件 (20 分钟)
.write(字符串)
: 这是最常用的写入方法,将一个字符串写入文件。 注意:write()
不会自动帮你换行,你需要手动添加换行符\n
。.writelines(字符串列表)
: 可以将一个包含字符串的列表写入文件。它会把列表里的每个字符串依次写入,但同样不会自动添加换行符\n
。- 使用
'w'
模式写入: 写入内容,会覆盖原有内容。# 使用 'w' 模式写入文件 file_write_w = open("my_output_w.txt", "w", encoding='utf-8') # 建议加上 encoding='utf-8' file_write_w.write("这是第一行内容。\n") # 手动加换行 file_write_w.write("这是第二行内容。\n") file_write_w.write("数字也可以写入,但要先转成字符串:" + str(123) + "\n") file_write_w.close() # 记得关闭! print("内容已写入 my_output_w.txt 文件。") # 写入一个列表 lines_to_write = ["春天来了,\n", "花儿开了。\n", "小鸟在唱歌。\n"] file_write_list = open("my_list_output.txt", "w", encoding='utf-8') file_write_list.writelines(lines_to_write) file_write_list.close() print("列表内容已写入 my_list_output.txt 文件。")
- 使用
'a'
模式追加: 在文件末尾添加内容。# 使用 'a' 模式追加写入文件 file_append_a = open("my_output_a.txt", "a", encoding='utf-8') # 如果文件不存在会新建 file_append_a.write("这是追加的第一行。\n") file_append_a.write("这是追加的第二行。\n") file_append_a.close() # 记得关闭! print("内容已追加到 my_output_a.txt 文件。")
- 动手实践: 学生编写代码,分别使用
'w'
和'a'
模式向同一个文件写入内容,观察文件内容的变化(打开文件查看)。 尝试使用.writelines()
写入一个字符串列表。 强调手动加\n
。
4. 从文件“看字” – 读取文件 (20 分钟)
- 使用
'r'
模式读取: 打开文件只为了读取内容。 .read(n)
: 读取文件中的n
个字符。如果不指定n
,则读取整个文件内容。.readline()
: 读取文件中的一行内容,包括换行符。.readlines()
: 读取文件中的所有行,并将每一行作为一个字符串存到列表中返回。每行字符串会包含换行符\n
。- 读取示例:
# 确保 my_output_w.txt 文件存在并有内容 # 读取整个文件 file_read_all = open("my_output_w.txt", "r", encoding='utf-8') content = file_read_all.read() print("--- 读取整个文件 ---") print(content) file_read_all.close() # 记得关闭! # 逐行读取 file_read_line = open("my_output_w.txt", "r", encoding='utf-8') print("--- 逐行读取 ---") line1 = file_read_line.readline() line2 = file_read_line.readline() print("第一行:", line1) print("第二行:", line2) file_read_line.close() # 记得关闭! # 读取所有行到列表中 file_read_lines = open("my_output_w.txt", "r", encoding='utf-8') lines_list = file_read_lines.readlines() print("--- 读取所有行到列表 ---") print(lines_list) file_read_lines.close() # 记得关闭! # 常用方法:使用 for 循环逐行读取 (更简洁) # 这种方法会自动处理文件对象和逐行读取,非常方便 print("--- 使用 for 循环逐行读取 ---") file_read_for = open("my_output_w.txt", "r", encoding='utf-8') for line in file_read_for: print("读到一行:", line, end="") # line 已经包含换行符,所以 print 就不加额外换行了 file_read_for.close() # 记得关闭!
- 动手实践: 学生尝试用不同的读取方法读取之前写入的文件,观察输出结果。 特别是对比
read()
,readline()
,readlines()
的区别,以及for
循环逐行读取的方便之处。
5. 最好的文件操作方式 – with 语句 (15 分钟)
- 问题: 每次操作完文件都要记得
close()
,如果忘记了或者程序中间报错了,文件可能就没关上,数据没保存好,或者资源没释放。 with open(...) as ...:
的好处: 这种语句块可以确保文件在使用完毕后自动关闭,不管中间是否发生错误。这是 Python 中推荐的文件操作方式。- 语法:
with open(文件路径, 模式, encoding='utf-8') as 文件对象: # 在这里对 文件对象 进行读写操作 print("文件已自动打开,正在操作...") # 这个代码块结束时,文件会自动关闭 # 代码块外部,文件已经关闭了 print("with 块结束,文件已自动关闭。")
`as 文件对象` 后面的名字可以自己定,比如 `f` 是常用的简称。
- 使用
with
重写之前的例子:print("--- 使用 with 写入文件 ---") with open("my_with_output.txt", "w", encoding='utf-8') as f: f.write("使用 with 写入第一行。\n") f.write("使用 with 写入第二行。\n") print("--- 使用 with 逐行读取文件 ---") try: # 使用 try...except 结构处理文件不存在的读取错误 with open("my_with_output.txt", "r", encoding='utf-8') as f: for line in f: print("读到一行:", line, end="") except FileNotFoundError: print("错误:要读取的文件不存在。")
- 动手实践: 学生将之前使用
open()
和close()
的读写代码,修改为使用with open(...) as f:
的方式。 特别注意缩进。 尝试读取一个不存在的文件,观察try...except
的效果(如果时间允许讲try...except
,否则只演示 FileNotFoundError)。
6. 课堂练习 (10 分钟)
让学生独立完成以下练习:
- 练习 1: 编写一个程序,使用
with open
和'w'
模式,创建一个名为my_notes.txt
的文件,向其中写入三行你的个人信息或喜欢的句子,每行独立。# 在这里写你的代码 # TODO: 使用 with open 打开文件 'my_notes.txt',模式 'w' # TODO: 写入第一行 # TODO: 写入第二行 # TODO: 写入第三行
- 练习 2: 编写一个程序,使用
with open
和'r'
模式,打开上一个练习创建的my_notes.txt
文件,使用for
循环逐行读取文件内容并打印。 - 练习 3: 编写一个程序,使用
with open
和'a'
模式,向my_notes.txt
文件末尾追加一行新的内容。然后再次读取并打印整个文件内容,确认新内容被追加。
7. 总结与提问 (5 分钟)
- 回顾: 回顾本节课内容:文件的概念和作用,
open()
打开文件和不同的模式(’r’, ‘w’, ‘a’),文件写入.write()
,.writelines()
(注意\n
),文件读取.read()
,.readline()
,.readlines()
,for
循环逐行读取,最推荐的with open(...) as f:
语句(自动关闭文件)。 - 提问:
- 为什么要使用文件?
- 打开文件读取用什么模式?写入并覆盖用什么模式?写入并添加到末尾用什么模式?
.write()
会自动换行吗?.read()
和.readline()
有什么区别?with open
的最大好处是什么?- 如果用
'r'
模式打开的文件不存在会怎样?
- 答疑: 回答学生问题。
8. 布置课后作业 (5 分钟)
- 作业 1: 编写一个程序,询问用户输入一段文字(比如日记的一段)。使用
with open
和'a'
模式,将用户输入的文字写入一个叫做diary.txt
的文件末尾。每次运行程序都可以往日记里追加新的内容。 - 作业 2: 编写一个程序,创建一个数字列表
numbers = [10, 20, 30, 40, 50]
。使用with open
和'w'
模式,将列表中的每个数字写入一个叫做numbers.txt
的文件,每个数字占一行。 - 作业 3: 编写一个程序,使用
with open
和'r'
模式,打开上一个作业创建的numbers.txt
文件,读取其中的数字,计算这些数字的总和,并打印结果。(提示:读取到的数字是字符串,需要转换为整数再相加)。 - 作业 4: (选做) 编写一个简单的学生信息管理程序。使用一个列表存储学生信息(每个学生是一个字典,包含姓名和分数)。让用户选择:1. 添加学生信息,2. 显示所有学生信息,3. 将学生信息保存到文件,4. 从文件加载学生信息,5. 退出。 保存和加载时,可以考虑每行保存一个学生信息(比如用逗号分隔姓名和分数),读取时再解析。
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。
评论(0)