内容大纲介绍
-
递归-删除文件夹
-
递归-拷贝文件夹
-
扩展: shutil模块的使用
1.递归-删除文件夹
"""
案例:
递归-删除文件夹
细节:
1. 出口 = 是文件, 就删除.
2. 规律 = 是文件夹, 就递归.
3. 细节 = 当前文件夹为空, 就删除该文件夹.
"""
# 导包
import os
# 1. 自定义函数 delete_dir(), 表示: 删除文件夹.
def delete_dir(path):
# 1.1 判断path是否是合法的文件夹路径.
if os.path.isdir(path):
# 1.2 走到这里, 说明path是合法的文件夹路径, 获取其所有的 子级文件(夹)名.
child_names = os.listdir(path) # ['aa', 'xyz', '绕口令.txt', '面试题.py']
# 1.3 遍历上述的 子级名, 将其拼接成: 绝对路径形式.
for child_name in child_names:
# 例如: child_name 为 'aa', '绕口令.txt'
child_path = path + '/' + child_name # 'd:/src/aa', 'd:/src/绕口令.txt'
# 1.4 判断child_path是否是文件
if os.path.isfile(child_path):
# 1.5 走到这里, 说明child_path是文件, 就删除.
os.remove(child_path)
else:
# 1.6 走到这里, 说明child_path是文件夹, 就递归.
delete_dir(child_path)
# 1.7 核心细节: 走到这里, 说明当前文件夹(path)为空, 删除即可.
os.rmdir(path) # remove directory: 删除目录(文件夹)
else:
# 1.3 走到这里, 说明path不是合法的文件夹路径, 提示错误.
print('路径有误, 不是合法的文件夹路径!')
# 2. 在main函数中, 测试调用.
if __name__ == '__main__':
delete_dir('d:/src')
2.递归-拷贝文件夹
"""
案例:
递归-拷贝文件夹
出口和规律:
1. 出口 = 是文件, 就拷贝.
2. 规律 = 是文件夹, 就递归.
细节:
1. 数据源路径 和 目的地路径必须合法.
2. 在目的地文件夹下 创建1个和 数据源文件夹 同名的文件夹.
3. 注意拷贝方式, 要用 rb 和 wb 二进制方式拷贝.
4. 注意数据源 和 目的地的 路径 问题.
"""
# 导包
import os
# 1. 定义函数 copy_dir(src_path, dest_path), 拷贝文件夹.
def copy_dir(src_path, dest_path):
"""
自定义函数, 用于拷贝文件夹的.
:param src_path: 数据源文件夹路径
:param dest_path: 目的地文件夹路径
:return: 无
"""
# 1.1 判断数据源文件夹 和 目的地文件夹 是否是合法路径.
if os.path.isdir(src_path) and os.path.isdir(dest_path): # 例如: src_path = 'd:/src', dest_path = 'd:/dest'
# 1.2 走到这里, 说明数据源 和 目的地都是合法的文件夹, 需要在 目的地文件夹下创建1个和数据源文件夹 同名的文件夹.
# 1.2.1 拼接新的目的地路径.
new_dest_path = dest_path + '/' + os.path.basename(src_path) # new_dest_path = 'd:/dest/src'
# 1.2.2 判断新的目的地路径如果啊不存在, 就创建.
if not os.path.isdir(new_dest_path):
os.mkdir(new_dest_path)
# 1.4 获取数据源文件夹下所有的子级(名)
child_names = os.listdir(src_path) # ['aa', 'xyz', '面试题.py', '绕口令.txt']
# 1.5 遍历上述的 数据源文件夹下的子级名, 将其拼接成合法的 数据源文件(夹)路径.
for child_name in child_names:
child_path = src_path + '/' + child_name # child_path = 'd:/src/aa' 'd:/src/面试题.py'
# 1.6 判断child_path是文件, 还是文件夹.
if os.path.isdir(child_path):
# 1.6.1 走到这里, 说明 child_path是文件夹, 就递归.
copy_dir(child_path, new_dest_path)
else:
# 1.6.2 走到这里, 说明 chi ld_path是文件, 就拷贝.
# 1.7 拼接目的地文件名.
dest_file_path = new_dest_path + '/' + child_name # dest_file_path = 'd:/dest/src/面试题.py'
# 1.8 具体的拷贝动作, 即: 把 child_path => dest_file_path
with open(child_path, 'rb') as src_f, open(dest_file_path, 'wb') as dest_f:
while True:
data = src_f.read(8192)
if not data:
break
dest_f.write(data)
else:
# 1.3 走到这里, 说明路径不合法.
print('路径有误, 请录入合法的文件夹路径!')
# 2. 在main函数中测试.
if __name__ == '__main__':
copy_dir('d:/src', 'd:/dest')
3.扩展-shutil模块
"""
扩展:
shutil属于Python内置的模块, 可以实现 拷贝文件, 文件夹等.
涉及到的函数:
copyfile(src_path, dest_path) 拷贝文件
copytree(src_path, dest_path) 拷贝文件夹
"""
# 导包
import shutil
if __name__ == '__main__':
# 1. 拷贝文件, 双方都要是 文件的路径.
# shutil.copyfile('d:/绕口令.txt', 'd:/dest/1.txt')
# shutil.copyfile('d:/绕口令.txt', 'd:/dest/ai30_基础班.py')
# 2. 拷贝文件夹, 细节: 目的地文件夹路径必须不存在, 否则报错.
# 例如: 'd:/src' => 'd:/dest', 则: 'd:/'必须存在, 'd:/dest'必须不存在.
shutil.copytree('d:/src', 'd:/dest')
# shutil.copytree('d:/src', 'd:/dest/src')