目标:
# 假设我们有一个目录结构如下:
# /path/to/directory/
# ├── file1.txt
# ├── subdir1/
# │ ├── file2.txt
# │ └── file3.txt
# └── subdir2/
# └── file4.txt
希望得到的结果是
/path/to/directory/file1.txt
/path/to/directory/subdir1/file2.txt
/path/to/directory/subdir1/file3.txt
/path/to/directory/subdir2/file4.txt
怎么办?
我们需要分门别类为os.listdir(/path/to/directory/)下面的内容做区别吗?如果文件结构只有两层还好办,层数很多怎么办?
我们在脑子里预先写代码的时候,就能意识到这里有嵌套结构,对于A:是文件;~A:是文件夹两种情况,对于后者我们又需要判断文件夹下的内容到底属于哪一种情况。于是又要考虑同样的判断,子子孙孙无穷尽也。
意识到这种嵌套,就有一个经验:可以用递归来完成这个任务。
在~A的情况下,先假设只有两级情况,两级的情况可以解决,就有可能解决后面的情况。因为一个能解决无穷级任务的代码,肯定能解决两级的情况。
对于~A的情况,对文件夹下的每个文件,调用这个fun(),那么肯定是可以按照第一种情况解决问题的。
现在这个代码能够解决两级的问题了。那么对于三级的嵌套,它也可以通过A和~A化解成子任务,也能解决。于是数学归纳法成立了,它可以解决无穷级的问题。
代码如下:
def walkfile(spath):
"""get files in input spath """
files = os.listdir(spath)
for file in files:
tmppath = os.path.join(spath, file)
if not os.path.isdir(tmppath):
yield tmppath
else:
for lowfile in walkfile(tmppath): # 递归结构
yield lowfile