注:由于源代码在递归部分阐述稍欠清晰,文中所示为改写之后的递归代码,测试后与源代码功能相同
以下展示了一个功能是打印文件夹目录的python代码,注意程序的第20行,存在一处递归调用,现对代码做出分析如下:
需求分析:我们需要打印出一个给定文件夹下所有文件信息,如果存在子文件夹,则需要打印子文件夹的相关信息,如果子文件夹下还有子文件夹,同理我们需要这个子子文件夹的信息。换言之,给定文件目录下,所有层级的文件信息我们都要读取出来
算法分析:在这个问题中,我们无法知道给定的文件目录下到底有多少层级的子文件夹。在这个时候我们能够想到的应该是使用递归算法,当递归到最后一个层级的子文件夹时,没有其他子文件夹可以遍历,那么函数会逐级返回,从而我们获得了所需要的文件目录结构。
具体实现:
#!/usr/bin/python
# -*-coding: UTF-8 -*-
import os
allFileNum = 0
def printPath(level, path):
global allFileNum
'''''
打印一个目录下的所有文件夹和文件
'''
# 所有文件
fileList = []
# 返回一个列表,其中包含在目录条目的名称(google翻译)
files = os.listdir(path)
for f in files:
if(os.path.isdir(path + '/' + f)):
if(f[0] != '.'): # 排除隐藏文件夹。因为隐藏文件夹过多
print '-' * level, f
# 打印目录下的所有文件夹和文件,目录级别+1
printPath((level + 1), path + '/' + f) #recursion
if(os.path.isfile(path + '/' + f)):
# 添加文件
fileList.append(f)
for fl in fileList:
# 打印文件
print '-' * level, fl
# 随便计算一下有多少个文件
allFileNum = allFileNum + 1
print "Please enter the directory path you want to list all file info: "
yourPath = raw_input()
if __name__ == '__main__':
printPath(level = 1 , path = yourPath )
print '总文件数 =', allFileNum