zoukankan      html  css  js  c++  java
  • 使用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命令。

  • 相关阅读:
    Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
    mac 上面安装mysql-python
    NSConditionLock
    NSCondition
    web.py 学习(二)Worker
    web.py 学习(-)Rocket web框架
    ARC 下面可能导致的内存问题
    WireShark 抓取Telnet包
    node.js里npm install --save 与 npm install --save-dev 的区别
    最近阅读链接
  • 原文地址:https://www.cnblogs.com/luo630/p/9195526.html
Copyright © 2011-2022 走看看