shutil 模块(拷贝和压缩)
shutil 模块是python 标准库中提供的,主要用来做文件和文件夹的拷贝、移动、删除等;还可以做文件和文件夹的压缩、解压缩操作。
os 模块提供了对目录或文件的一般操作。shutil 模块作为补充,提供了移动、复制、压缩、解压等操作,这些os 模块都没有提供。
shutil 模块 – 选择拷贝
import shutil
# copy 文件
shutil.copyfile("a.txt", "a_copy.txt")
# copy 目录,当拷贝的目录已存在时会报错(避免已存在目录被覆盖)。设置ignore属性可忽略指定文件格式被拷贝
shutil.copytree('movie/港台', '电影', ignore=shutil.ignore_patterns('*.txt', '*.csv'))
shutil 模块+zipfile 模块 – 压缩、解压
# shutil 模块
import shutil
# hutil.make_archive("目标地址/压缩名","文件格式","压缩内容")
shutil.make_archive("电影/Hong Kong", "zip", "movie/港台")
# zipfile 模块--压缩
import zipfile
z = zipfile.ZipFile("movie/a.zip", "w") # 创建一个可写入的压缩文件
z.write("a.txt")
z.write("a_copy.txt") # 向已建压缩包内存入文件
z.close() # 关闭占用资源
# zipfile 模块--解压
z2 = zipfile.ZipFile("movie/a.zip", "r") # 对压缩文件读取解压
z2.extractall("电影") # 设置解压的地址
z2.close()
递归算法
递归的基本思想就是“自己调用自己”,一个使用递归技术的方法将会直接或者间接的调用自己。利用递归可以用简单的程序来解决一些复杂的问题。比如:斐波那契数列的计算、汉诺塔、快排等问题。
递归结构包括两个部分:
- 定义递归头,即什么时候不调用自身方法,也就是递归的结束条件。如果没有头,将陷入死循环。
- 递归体,即么时候需要调用自身方法。
# 使用递归求n!
def factorial(n):
if n==1:
return 1
else:
return n*factorial(n-1)
print(factorial(5))
- 递归的缺陷
简单的程序是递归的优点之一。但是递归调用会占用大量的系统堆栈,内存耗用多。在递归调用层次多时速度要比循环慢的多,所以在使用递归时要慎重。
# 使用递归算法遍历目录下所有文件
import os
allfile = []
def GetFiles(path, level): # level属性用于展示时的缩进,更美观
ChildFiles = os.listdir(path) # 返回path 目录下的文件和目录列表
for file in ChildFiles:
filepath = os.path.join(path, file)
if os.path.isdir(filepath): # os.path模块判断是否为目录
GetFiles(filepath, level + 1) # 递归函数,实现子目录中的目录展开
allfile.append("\t" * level + filepath) # 将目录存入列表,方便排序
GetFiles(os.getcwd(), 0)
for f in reversed(allfile): # 将列表倒叙迭代展示
print(f)