Windows 10家庭中文版,Python 3.6.4

今天学习了os模块,下面是使用它开发的一个展示目录下的文件和文件夹的函数,代码如下:

 import os

 # deep大于等于1的整数,默认为1;
# deep为1时,用于显示当前目录下的文件和文件夹;
# deep控制显示的当前目录下的层级,当前为1,每深入一层(进入下一级文件夹),加1;
def listdir(deep = 1):
# path is an absolute path
def listdir_inner(path, ilevel = 0):
if ilevel == deep:
return # 添加到每条文件信息前面的缩进,每深入一层增加4个空格
prefix = ' ' * (4 * ilevel) # 检查目录是否存在
if not os.path.exists(path):
print(prefix, 'Error: Path (%s) does not exist.' % path, sep = '')
return # 如果path代表文件,立即返回
if os.path.isfile(path):
print(prefix, 'Warning: ', path, ' is a file!', sep = '')
return # 统一使用Linux风格的路径
path = path.replace('\\', '/') if not path.endswith('[/\\]'):
path += '/' # 判断目录path是否可以执行os.listdir操作
# 在Windows下产生了PermissionError错误,但用os.access检查却是可以访问的
# Linux上可能使用os.stat()来检查文件或文件夹的权限
perm_ok = True
try:
dlist = os.listdir(path)
except PermissionError as err:
perm_ok = False
print(prefix, 'Error: ', err.strerror, sep = '')
except Exception as err:
perm_ok = False
print(prefix, 'Error: ', err.strerror, sep = '') # 展示目录下的文件和文件夹
if perm_ok:
for item in dlist:
if os.path.isfile(path + item):
# 文件,直接输出
print(prefix, 'F-', item, sep = '')
elif os.path.isdir(path + item):
# 子目录,输出信息
print(prefix, 'D-', item, sep = '')
# 寻找子目录下的文件和文件夹
# 注意,层级加1了
listdir_inner(path + item + '/', ilevel + 1)
else:
# 其它类型,可能是link、mount等
print(prefix, 'X-', item, sep = '') return listdir_inner # 测试
if __name__ == '__main__':
d2 = listdir(deep = 2) print('展示目录下的文件:')
# 展示D盘下的文件及文件夹目录,深度为2
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命令。

使用os模块实现展示目录下的文件和文件夹的更多相关文章

  1. python3通过os模块统计指定目录下文件个数

    代码: import os path = r"C:\Users\Administrator\Desktop\***" print('filenum:',len([lists for ...

  2. python os模块获取指定目录下的文件列表

    bath_path = r"I:\ner_results\ner_results" dir_list1 = os.listdir(bath_path) for dir1 in di ...

  3. Python实现插件机制——自动import一个目录下的所有.py文件

    假设有这样一个目录结构: /src          main.py          /plugins                __init__.py                a.py  ...

  4. 一个获取指定目录下一定格式的文件名称和文件修改时间并保存为文件的python脚本

    摘自:http://blog.csdn.net/forandever/article/details/5711319 一个获取指定目录下一定格式的文件名称和文件修改时间并保存为文件的python脚本 ...

  5. Python 遍历目录下的子目录和文件

    import os A: 遍历目录下的子目录和文件 for root,dirs ,files in os.walk(path) root:要访问的路径名 dirs:遍历目录下的子目录 files:遍历 ...

  6. gen目录无法更新,或者gen目录下的R.JAVA文件无法生成

    gen目录无法更新,或者gen目录下的R.JAVA文件无法生成 1.gen目录的用处 android gen目录下的R.java并不是由用户创建,而是android工程本身将android的资源进行自 ...

  7. php源码之遍历目录下的所有的文件

    <?php //遍历目录下的所有的文件 -- 递归调用 // http://www.manongjc.com/article/1495.html function get_all_file1($ ...

  8. 使用 NIO.2 遍历目录下所有的Java文件

    package wellGrounded; import java.io.IOException; import java.nio.file.FileVisitResult; import java. ...

  9. java 提取目录下所有子目录的文件到指定位置

    package folder; import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundExcept ...

随机推荐

  1. wazhu之agent manage

      代理生命周期 注册代理 一旦代理程序安装在要监控的计算机上,就必须向Wazuh管理器注册才能建立通信.这可以通过命令行,Authd或RESTful API完成. 注册代理将保留在管理器中,直到用户 ...

  2. SpringBoot 中使用redis以及redisTemplate

    1.首先在pom.xml中添加依赖 <dependency> <groupId>org.springframework.boot</groupId> <art ...

  3. Java EE之会话

    1.需要会话的原因 所有HTTP服务器技术都普遍采用HTTP会话的概念,并且Java EE也在规范中添加了对会话的支持. 维持状态 会话用于维持请求和请求之间的状态.HTTP请求自身是完全无状态的.从 ...

  4. 基于excel导入数据到ms sql server

    OLE DB (Object Linking and Embedding, Database, sometimes written as OLEDB or OLE-DB) an API designe ...

  5. Angular http跨域

    原文:Angular http跨域 - 飞翔的小仓鼠 - 博客园 var app = angular.module('Mywind',['ui.router']); app.controller('M ...

  6. codeforces.com/contest/251/problem/C

    C. Number Transformation time limit per test 2 seconds memory limit per test 256 megabytes input sta ...

  7. .Net并行编程系列之三:创建带时间限制(Timeout)的异步任务并取得异步任务的结果

    尝试创建基于MVVM三层架构的异步任务: 场景:View层触发ViewModel层的动作请求,ViewModel层异步的从Model层查询数据,当数据返回或者请求超时时正确更新ViewModel层数据 ...

  8. linux 中 virtualenvwrapper的使用

    原文链接:http://www.jianshu.com/p/3abe52adfa2b Virtaulenvwrapper Virtaulenvwrapper是virtualenv的扩展包,用于更方便管 ...

  9. NO.6LINUX基本命令

    1.练习1 ) 将用户信息数据库文件和组信息数据库文件纵向合并为一个文件/1.txt(覆盖) cd / cat /etc/passwd /etc/group>1.txt 2) 将用户信息数据库文 ...

  10. maven添加docker插件无法引入,运行时报错 No plugin found for prefix 'docker'

    maven 安装不上docker插件,运行 提示:docker:bulid时No plugin found for prefix 'docker' 原因是maven不能识别 docker-maven- ...