• 时长: 90 分钟
  • 教学目标:
    • 复习 os 模块的基本作用(与操作系统交互)。
    • 学习使用 os.path 子模块处理文件和文件夹路径。
    • 掌握如何检查文件或文件夹是否存在 (os.path.exists())。
    • 学会区分路径指向的是文件还是文件夹 (os.path.isfile(), os.path.isdir())。
    • 学习如何获取某个文件夹下的所有文件和文件夹列表 (os.listdir())。
    • 理解如何通过遍历文件夹内容、结合条件判断和路径处理,实现一个简单的文件查找“算法”。
    • 练习将文件系统操作与循环、条件判断、函数等结构结合使用。

课程内容

1. 复习与引入 (10 分钟)

  • 复习: 快速回顾上一节课的 random 模块,以及它在模拟中的应用。回顾我们学过的数据结构(列表、字典等)和控制结构(循环、条件判断)。回顾文件操作(打开、读写、关闭)和 with open()
  • 提出问题: 老师提问:“我们现在会读写文件了,但文件都只能放在当前程序所在的文件夹里,或者写一个很长的绝对路径。如果我想让程序知道电脑里有没有某个文件?我想列出某个文件夹里的所有文件名字?我想找到某个文件夹里所有 .txt 文件,把它们找出来怎么办?”
  • 引出 os 模块进阶: 这些操作都和操作系统以及文件系统有关。我们之前简单用过 os 模块(比如获取当前路径),今天我们来更深入地学习 os 模块,特别是它的 os.path 部分,以及如何用它来“探索”电脑里的文件和文件夹。这个探索过程,其实就是一种“查找”的算法应用。

2. 复习 OS 模块与基本功能 (5 分钟)

  • 概念: os 模块(Operating System)提供了很多和操作系统互动的功能,比如文件和文件夹的操作、执行系统命令等。
  • 导入:
    import os # 导入 os 模块
    
  • 简单回顾:
    • 获取当前工作目录(程序正在哪个文件夹里运行):os.getcwd()
      print("当前工作目录是:", os.getcwd())
      
    • 改变当前工作目录:os.chdir(路径) (这个功能比较少用,注意改变后相对路径会变)
    • 执行系统命令:os.system("命令") (比如在 Windows 上 os.system("calc") 打开计算器,了解即可,实际开发中不推荐直接用它执行用户输入的命令,有安全风险)

3. 处理文件和文件夹路径 – os.path 子模块 (20 分钟)

  • 概念: os.pathos 模块的一个子模块,专门用来处理路径字符串,比如拼接路径、判断路径是否存在、判断路径是文件还是文件夹等。使用 os.path 的好处是它可以兼容不同的操作系统(Windows 用 \,Linux/macOS 用 /)。
  • 拼接路径 – os.path.join(): 将多个路径部分组合成一个完整的路径字符串,会自动使用当前操作系统的路径分隔符。
    # 在当前文件夹下的 "data" 文件夹里,有一个 "info.txt" 文件
    folder = "data"
    file_name = "info.txt"
    # 错误的拼接方法 (不跨平台):
    # file_path = folder + "/" + file_name # 在 Windows 上就不对了
    # file_path = folder + "\\" + file_name # 在 Linux/macOS 上就不对了
    
    # 正确的拼接方法 (跨平台):
    file_path = os.path.join(folder, file_name)
    print(f"拼接后的路径是: {file_path}") # 在 Windows 上可能是 data\info.txt,在 Linux/macOS 上是 data/info.txt
    
    # 可以拼接多个部分
    full_path = os.path.join("C:", "Users", "YourName", "Documents", "my_file.txt") # Windows 示例
    print(f"完整路径示例: {full_path}")
    
  • 检查路径是否存在 – os.path.exists(): 判断给定的路径在电脑上是否存在。
    print("当前文件是否存在?", os.path.exists(__file__)) # __file__ 表示当前程序文件的完整路径
    print("一个不存在的文件是否存在?", os.path.exists("non_existent_file_12345.txt"))
    print("当前工作目录是否存在?", os.path.exists(os.getcwd()))
    
  • 判断是文件还是文件夹 – os.path.isfile()os.path.isdir():
    • os.path.isfile(路径): 如果路径存在且指向一个文件,返回 True,否则返回 False
    • os.path.isdir(路径): 如果路径存在且指向一个文件夹,返回 True,否则返回 False
    import os
    # 假设当前目录下有一个文件 my_program.py 和一个文件夹 my_folder
    
    # 检查当前文件
    print(f"'{__file__}' 是文件吗?", os.path.isfile(__file__))
    print(f"'{__file__}' 是文件夹吗?", os.path.isdir(__file__))
    
    # 检查当前目录
    print(f"'{os.getcwd()}' 是文件吗?", os.path.isfile(os.getcwd()))
    print(f"'{os.getcwd()}' 是文件夹吗?", os.path.isdir(os.getcwd()))
    
    # 检查一个不存在的路径
    print("'不存在的路径' 是文件吗?", os.path.isfile("non_existent_path"))
    print("'不存在的路径' 是文件夹吗?", os.path.isdir("non_existent_path"))
    
  • 动手实践: 学生尝试使用 os.path.join() 拼接不同的路径。 尝试使用 os.path.exists() 检查当前程序文件和当前文件夹是否存在。 尝试创建一个空的文件夹(手动创建即可),然后用 os.path.isdir() 检查它。

4. 列出文件夹内容 – os.listdir() (10 分钟)

  • os.listdir(路径) 的作用: 获取指定路径下的所有文件和文件夹的名称列表。注意:它只返回名称,不包含完整的路径,也不包含隐藏文件(通常)。
    import os
    
    # 列出当前工作目录下的所有文件和文件夹名称
    contents = os.listdir(os.getcwd())
    print(f"当前目录 '{os.getcwd()}' 下的内容:")
    print(contents) # 这是一个列表
    
    # 列出上级目录的内容 (如果当前目录有上级)
    # print("上级目录内容:", os.listdir(".."))
    
    # 如果目录不存在,会报错 FileNotFoundError
    # print(os.listdir("non_existent_folder_xyz")) # 错误!
    
  • 动手实践: 学生尝试使用 os.listdir() 列出当前文件夹下的内容。 如果有其他文件夹,尝试列出其他文件夹的内容。

5. 应用:实现一个简单的文件查找“算法” (25 分钟)

  • 问题: 如何找到当前文件夹下所有以 .txt 结尾的文件?
  • 思考步骤 (算法):
    1. 确定要查找的文件夹路径(例如,当前工作目录)。
    2. 获取这个文件夹下所有文件和文件夹的名称列表(使用 os.listdir())。
    3. 创建一个空的列表,用来存放找到的 .txt 文件的完整路径
    4. 遍历获取到的名称列表。
    5. 对于列表中的每一个名称:
      • 将当前文件夹路径和这个名称拼接起来,得到完整的路径(使用 os.path.join())。
      • 判断这个完整路径是否指向一个文件(使用 os.path.isfile())。
      • 如果确实是一个文件,再判断这个文件的名字是否以 .txt 结尾(使用字符串的 .endswith(".txt") 方法)。
      • 如果既是文件,文件名又以 .txt 结尾,就将这个完整路径添加到结果列表中。
    6. 遍历结束后,打印结果列表。
  • 用代码实现这个算法(封装在函数中):
    import os
    
    # 定义一个函数来查找指定文件夹下特定后缀的文件
    # 参数 folder_path 是要查找的文件夹路径
    # 参数 extension 是要查找的文件后缀 (例如 ".txt")
    def find_files_with_extension(folder_path, extension):
        found_files = [] # 创建一个空列表存放结果
    
        # 检查文件夹是否存在,并且确实是文件夹
        if not os.path.exists(folder_path):
            print(f"错误:文件夹 '{folder_path}' 不存在!")
            return found_files # 返回空列表
        if not os.path.isdir(folder_path):
             print(f"错误:'{folder_path}' 不是一个文件夹!")
             return found_files # 返回空列表
    
        try:
            # 1. 获取文件夹下的所有名称列表
            items = os.listdir(folder_path)
    
            # 2. 遍历名称列表
            for item_name in items:
                # 3. 拼接完整路径
                item_full_path = os.path.join(folder_path, item_name)
    
                # 4. 判断是否是文件
                if os.path.isfile(item_full_path):
                    # 5. 判断文件名是否以指定的后缀结尾
                    if item_name.endswith(extension):
                        # 6. 如果符合条件,添加到结果列表
                        found_files.append(item_full_path)
    
        except Exception as e:
             print(f"查找过程中发生错误: {e}")
             # 即使出错,也返回目前找到的部分文件列表
    
        # 7. 返回找到的文件列表
        return found_files
    
    # --- 主程序部分 ---
    # 指定要查找的文件夹 (例如当前目录)
    search_folder = os.getcwd() # 或者可以是其他路径,比如 "D:\\MyDocuments"
    
    # 指定要查找的文件后缀
    file_extension = ".txt"
    
    print(f"正在 '{search_folder}' 文件夹中查找以 '{file_extension}' 结尾的文件...")
    
    # 调用函数进行查找
    txt_files = find_files_with_extension(search_folder, file_extension)
    
    # 打印查找结果
    if len(txt_files) > 0:
        print(f"找到了以下 {len(txt_files)} 个 {file_extension} 文件:")
        for file_path in txt_files:
            print(file_path)
    else:
        print(f"在该文件夹中没有找到任何 {file_extension} 文件。")
    
    
  • 引导与讨论: 带领学生一步步理解代码如何对应算法步骤。强调 os.path.join() 的作用,os.path.isfile() 的作用,以及如何结合 endswith() 进行筛选。解释为什么要把查找逻辑放在函数里。

6. 课堂练习 (10 分钟)

让学生独立完成以下练习:

  • 练习 1: 修改上面的 find_files_with_extension 函数,让它查找并返回指定文件夹下所有文件夹的完整路径列表,而不是文件。
    # 在这里修改 find_files_with_extension 函数
    def find_subfolders(folder_path):
        found_folders = []
        # TODO: 添加文件夹存在和是目录的检查
        try:
             items = os.listdir(folder_path)
             for item_name in items:
                  item_full_path = os.path.join(folder_path, item_name)
                  # TODO: 判断 item_full_path 是否是一个文件夹 (使用 os.path.isdir())
                  # TODO: 如果是文件夹,添加到 found_folders 列表
                  pass
        except Exception as e:
             print(f"查找过程中发生错误: {e}")
        return found_folders
    
    # 调用函数测试
    subfolders = find_subfolders(os.getcwd())
    print(f"当前目录下的文件夹有: {subfolders}")
    
  • 练习 2: 编写一个程序,列出当前目录下所有文件名中包含字母 ‘a’ 的文件和文件夹的名称。(提示:使用 os.listdir(),遍历结果列表,使用字符串的 in 运算符判断)。

7. 总结与提问 (5 分钟)

  • 回顾: 回顾本节课内容:os.path 子模块,路径的拼接 os.path.join(),存在性检查 os.path.exists(),类型判断 os.path.isfile(), os.path.isdir(),列出文件夹内容 os.listdir(),以及如何将这些工具组合起来,实现一个查找文件的简单“算法”。
  • 提问:
    • 为什么用 os.path.join() 拼接路径比直接用 + 好?
    • 如何检查一个路径是否指向一个真实存在的文件?
    • os.listdir() 返回的是什么?是完整路径吗?
    • 我们编写的查找 .txt 文件的步骤(算法)是怎样的?
  • 答疑: 回答学生问题。

8. 布置课后作业 (5 分钟)

  • 作业 1: 编写一个函数 count_files_in_folder(folder_path),接收一个文件夹路径作为参数,计算并返回该文件夹下一共有多少个文件(不包含子文件夹)。
  • 作业 2: 编写一个程序,让用户输入一个文件夹路径和一个文件名。检查该文件夹下是否存在这个文件。如果存在,打印“文件已找到!”;如果不存在或路径无效,打印“文件未找到或文件夹不存在。”
  • 作业 3: 编写一个函数 find_large_files(folder_path, min_size),接收文件夹路径和最小文件大小(字节)作为参数。遍历该文件夹下的所有文件,找出大小大于等于指定最小大小的文件,将它们的完整路径和大小存储在一个列表中(列表中每个元素是一个元组 (文件路径, 文件大小) 或字典 {'path': ..., 'size': ...}),并返回这个列表。(提示:需要导入 os 模块,使用 os.path.getsize(文件路径) 获取文件大小)。
  • 作业 4: (选做) 编写一个程序,实现查找功能:让用户输入一个文件名(或部分文件名)。在当前文件夹及其所有子文件夹中递归查找该文件,如果找到,打印文件的完整路径。这是一个更复杂的查找算法(遍历目录树)。
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。