使用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命令。

 

posted @ 2018-06-18 17:46  快乐的欧阳天美1114  阅读(1330)  评论(0编辑  收藏  举报