使用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 ...
随机推荐
- 一种KEIL中定义过的变量在使用中提示未定义的情况
[环境] > KEIL5.25 > win10 > @2018-4-23 [问题] 头文件互包含导致的错误(使用了另一文件的类型定义) 文件<fileA.h> <f ...
- BZOJ3829 [Poi2014]FarmCraft 【树形dp】
题目链接 BZOJ3829 题解 设\(f[i]\)为从\(i\)父亲进入\(i\)之前开始计时,\(i\)的子树中最晚装好的时间 同时记\(siz[i]\)为节点\(i\)子树大小的两倍,即为从父亲 ...
- Android Studio之BuildConfig类
https://blog.csdn.net/lvxiangan/article/details/71601451 Android Studio开发中,把一个module输出打包为jar文件,我们会发现 ...
- bzoj 4871: [Shoi2017]摧毁“树状图”
4871: [Shoi2017]摧毁“树状图” Time Limit: 25 Sec Memory Limit: 512 MBSubmit: 53 Solved: 9[Submit][Status ...
- centos install python3 pip3
yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-dev ...
- Python【面向对象编程】
#1.python中,类名首字母都大写#2.在python3中,经典类和新式类没有任何区别#3.在python2中,经典类和新式类的区别主要体现在多继承上,经典类是深度优先,新式类是广度优先#4.在p ...
- GO_04:GO语言基础条件、跳转、Array和Slice
1. 判断语句if 1. 条件表达式没有括号(这点其他语言转过来的需要注意) 2. 支持一个初始化表达式(可以是并行方式,即:a, b, c := 1, 2, 3) 3. 左大括号必须和条件语句或 e ...
- P3572 [POI2014]PTA-Little Bird
P3572 [POI2014]PTA-Little Bird 一只鸟从1跳到n.从1开始,跳到比当前矮的不消耗体力,否则消耗一点体力,每次询问有一个步伐限制k,求每次最少耗费多少体力 很简短的题目哼. ...
- windows下使用tftp工具下载文件到开发板(linux)
1.下载tftp工具,也可以上CSDN找个免费0积分的 http://www.52z.com/soft/11886.html 2.确保开发板和windows在同一网段 比如192.168.101.*段 ...
- jenkins+testNg+maven+git+selenium自动化集成
准备环境,提前安装好Jenkins及git,maven插件 1.首先我们新建一个maven的工程,并且在pom.xml中配置好我们依赖的一些jar包 <?xml version="1. ...