使用os模块实现展示目录下的文件和文件夹
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模块实现展示目录下的文件和文件夹的更多相关文章
- python3通过os模块统计指定目录下文件个数
代码: import os path = r"C:\Users\Administrator\Desktop\***" print('filenum:',len([lists for ...
- python os模块获取指定目录下的文件列表
bath_path = r"I:\ner_results\ner_results" dir_list1 = os.listdir(bath_path) for dir1 in di ...
- Python实现插件机制——自动import一个目录下的所有.py文件
假设有这样一个目录结构: /src main.py /plugins __init__.py a.py ...
- 一个获取指定目录下一定格式的文件名称和文件修改时间并保存为文件的python脚本
摘自:http://blog.csdn.net/forandever/article/details/5711319 一个获取指定目录下一定格式的文件名称和文件修改时间并保存为文件的python脚本 ...
- Python 遍历目录下的子目录和文件
import os A: 遍历目录下的子目录和文件 for root,dirs ,files in os.walk(path) root:要访问的路径名 dirs:遍历目录下的子目录 files:遍历 ...
- gen目录无法更新,或者gen目录下的R.JAVA文件无法生成
gen目录无法更新,或者gen目录下的R.JAVA文件无法生成 1.gen目录的用处 android gen目录下的R.java并不是由用户创建,而是android工程本身将android的资源进行自 ...
- php源码之遍历目录下的所有的文件
<?php //遍历目录下的所有的文件 -- 递归调用 // http://www.manongjc.com/article/1495.html function get_all_file1($ ...
- 使用 NIO.2 遍历目录下所有的Java文件
package wellGrounded; import java.io.IOException; import java.nio.file.FileVisitResult; import java. ...
- java 提取目录下所有子目录的文件到指定位置
package folder; import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundExcept ...
随机推荐
- BZOJ 1497 [NOI2006]最大获利
1497: [NOI2006]最大获利 Description 新的技术正冲击着手机通讯市场,对于各大运营商来说,这既是机遇,更是挑战.THU集团旗下的CS&T通讯公司在新一代通讯技术血战的前 ...
- fzyzojP3580 -- [校内训练-互测20180315]小基的高智商测试
题目还有一个条件是,x>y的y只会出现一次(每个数直接大于它的只有一个) n<=5000 是[HNOI2015]实验比较 的加强版 g(i,j,k)其实可以递推:g(i,j,k)=g(i- ...
- php 百家姓
private $surname = array('赵','钱','孙','李','周','吴','郑','王','冯','陈','褚','卫','蒋','沈','韩','杨','朱','秦','尤' ...
- RabbitMQ 相关概念
RabbitMQ 整体上是一个生产者与消费者模型,主要负责接收.存储和转发消息.可以把消息传递的过程想象成:当你讲一个包裹送到邮局,邮局会暂存并最终将邮件通过邮递员送到收件人的手上,RabbitMQ ...
- [python]python安装包错误
“UnicodeDecodeError: ‘ascii’ codec can’t decode : ordinal not )” 在windows XP上 解决方法: Solution: ====== ...
- Git2:Git基本操作
目录 一.git全局配置 二.创建一个版本库 三.git的常用操作 1.版本提交与回退 1.1.版本提交 1.2.版本回退 2.工作区.版本库与暂存区 2.1.工作区 2.2.版本库 3.管理文件的修 ...
- [Java] I/O底层原理之一:字符流、字节流及其源码分析
关于 I/O 的类可以分为四种: 关于字节的操作:InputStream 和 OutPutStream: 关于字符的操作:Writer 和 Reader: 关于磁盘的操作:File: 关于网络的操作: ...
- mysql 复制表数据,表结构的3种方法
什么时候我们会用到复制表?例如:我现在对一张表进行操作,但是怕误删数据,所以在同一个数据库中建一个表结构一样,表数据也一样的表,以作备份.如果用mysqldump比较麻烦,备份.MYD,.MYI这样的 ...
- bzoj千题计划130:bzoj1305: [CQOI2009]dance跳舞
http://www.lydsy.com/JudgeOnline/problem.php?id=1305 每个人拆为喜欢(yes)和不喜欢(no)两个点 二分答案 1.每两个人之间只能跳一次 喜欢则 ...
- 数据结构编程实验——chapter10-应用经典二叉树编程
二叉树不仅结构简单.节省内存,更重要是是这种结构有利于对数据的二分处理.之前我们提过,在二叉树的基础上能够派生很多经典的数据结构,也是下面我们将进行讨论的知识点: (1) 提高数据查找效率的二叉排 ...