- 时长: 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.path
是os
模块的一个子模块,专门用来处理路径字符串,比如拼接路径、判断路径是否存在、判断路径是文件还是文件夹等。使用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
结尾的文件? - 思考步骤 (算法):
- 确定要查找的文件夹路径(例如,当前工作目录)。
- 获取这个文件夹下所有文件和文件夹的名称列表(使用
os.listdir()
)。 - 创建一个空的列表,用来存放找到的
.txt
文件的完整路径。 - 遍历获取到的名称列表。
- 对于列表中的每一个名称:
- 将当前文件夹路径和这个名称拼接起来,得到完整的路径(使用
os.path.join()
)。 - 判断这个完整路径是否指向一个文件(使用
os.path.isfile()
)。 - 如果确实是一个文件,再判断这个文件的名字是否以
.txt
结尾(使用字符串的.endswith(".txt")
方法)。 - 如果既是文件,文件名又以
.txt
结尾,就将这个完整路径添加到结果列表中。
- 将当前文件夹路径和这个名称拼接起来,得到完整的路径(使用
- 遍历结束后,打印结果列表。
- 用代码实现这个算法(封装在函数中):
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: (选做) 编写一个程序,实现查找功能:让用户输入一个文件名(或部分文件名)。在当前文件夹及其所有子文件夹中递归查找该文件,如果找到,打印文件的完整路径。这是一个更复杂的查找算法(遍历目录树)。
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。
评论(0)