第十六课:和电脑“书写”与“阅读” – 文件操作

  • 时长: 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. 退出。 保存和加载时,可以考虑每行保存一个学生信息(比如用逗号分隔姓名和分数),读取时再解析。

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。