使用os模块实现展示目录下的文件和文件夹
Windows 10家庭中文版,Python 3.6.4
今天学习了os模块,下面是使用它开发的一个展示目录下的文件和文件夹的函数,代码如下:
1 import os 2 3 # deep大于等于1的整数,默认为1; 4 # deep为1时,用于显示当前目录下的文件和文件夹; 5 # deep控制显示的当前目录下的层级,当前为1,每深入一层(进入下一级文件夹),加1; 6 def listdir(deep = 1): 7 # path is an absolute path 8 def listdir_inner(path, ilevel = 0): 9 if ilevel == deep: 10 return 11 12 # 添加到每条文件信息前面的缩进,每深入一层增加4个空格 13 prefix = ' ' * (4 * ilevel) 14 15 # 检查目录是否存在 16 if not os.path.exists(path): 17 print(prefix, 'Error: Path (%s) does not exist.' % path, sep = '') 18 return 19 20 # 如果path代表文件,立即返回 21 if os.path.isfile(path): 22 print(prefix, 'Warning: ', path, ' is a file!', sep = '') 23 return 24 25 # 统一使用Linux风格的路径 26 path = path.replace('\\', '/') 27 28 if not path.endswith('[/\\]'): 29 path += '/' 30 31 # 判断目录path是否可以执行os.listdir操作 32 # 在Windows下产生了PermissionError错误,但用os.access检查却是可以访问的 33 # Linux上可能使用os.stat()来检查文件或文件夹的权限 34 perm_ok = True 35 try: 36 dlist = os.listdir(path) 37 except PermissionError as err: 38 perm_ok = False 39 print(prefix, 'Error: ', err.strerror, sep = '') 40 except Exception as err: 41 perm_ok = False 42 print(prefix, 'Error: ', err.strerror, sep = '') 43 44 # 展示目录下的文件和文件夹 45 if perm_ok: 46 for item in dlist: 47 if os.path.isfile(path + item): 48 # 文件,直接输出 49 print(prefix, 'F-', item, sep = '') 50 elif os.path.isdir(path + item): 51 # 子目录,输出信息 52 print(prefix, 'D-', item, sep = '') 53 # 寻找子目录下的文件和文件夹 54 # 注意,层级加1了 55 listdir_inner(path + item + '/', ilevel + 1) 56 else: 57 # 其它类型,可能是link、mount等 58 print(prefix, 'X-', item, sep = '') 59 60 return listdir_inner 61 62 # 测试 63 if __name__ == '__main__': 64 d2 = listdir(deep = 2) 65 66 print('展示目录下的文件:') 67 # 展示D盘下的文件及文件夹目录,深度为2 68 d2('d:/')
使用方法见测试——调用listdir函数建立显示不同深度的函数,再使用新建的函数 展示传入的目录(绝对路径)下的文件和文件夹。
测试可以更多的,在目前的代码下,使用d:、d:/、d:\\三个方式都是访问D盘下的文件夹和目录。
调试过程中遇到错误:
C盘有下一个识别为文件夹的目录无法执行listdir:
使用os.access(...)函数检查其读写执行权限时,都是可以的。
使用os.stat(...)函数检测其权限,也是可以的,但却无法执行listdir,而且,如果此文件夹后面带着反斜杠传入os.stat(...),os.stat(...)执行就会报错。
后来网上找到一篇博文,其中使用win32security来检测文件权限,但发生错误:
此问题后面也没有继续深究了,先这样。
可能的测试输入:使用unitest模块或Flask学习时用到的pytest(都没用过)
d:
d:/
d:\\
c
d
e
d:/existed_file
d:/unexisted_file
c:/
...
下面是一个测试结果:
更改deep为1:
函数改进方向:
添加测试;
添加更专业的注释;
更改函数名为ulistdir,开头的u表示为用户自定义;
deep参数没有检测;
print(...)函数的使用方法需要改进,每个都有sep=''这个参数;
目前使用嵌套函数,可以改造为类来实现;
测试过检测本机Windows上的目录,扩展展示网络主机上的文件夹;
还有什么呢?
os.stat(...)函数还需要深入学习,以及Linux下的stat命令,以及ls命令。