为测试listdir功能,建如下目录树:
D:\test 的目录
2021/05/02 23:48 <DIR> .
2021/05/02 23:48 <DIR> ..
2021/05/02 22:56 <DIR> 01
2021/04/03 12:09 1,486 01.py
2021/05/02 22:56 <DIR> 02
2021/04/03 12:09 1,262 02.py
2021/05/02 23:48 <DIR> 03
2 个文件 2,748 字节
D:\test\01 的目录
2021/05/02 22:56 <DIR> .
2021/05/02 22:56 <DIR> ..
2021/04/03 12:09 1,088 1.1.py
2021/04/03 12:09 1,096 1.2.py
2021/04/03 12:09 1,472 1.3.py
3 个文件 3,656 字节
D:\test\02 的目录
2021/05/02 22:56 <DIR> .
2021/05/02 22:56 <DIR> ..
2021/04/03 12:09 2,014 2.1.py
2021/04/03 12:09 2,195 2.2.py
2021/04/03 12:09 1,207 2.3.py
2021/04/03 12:09 1,228 2.4.py
4 个文件 6,644 字节
D:\test\03 的目录
2021/05/02 23:48 <DIR> .
2021/05/02 23:48 <DIR> ..
0 个文件 0 字节
所列文件总数:
9 个文件 13,048 字节
11 个目录 316,223,115,264 可用字节
os.listdir 相当于dos命令dir d:\test,只显示第一层目录下的文件和子目录。
>>> import os
>>> path=r'd:\test'
>>> os.listdir(path)
['01', '01.py', '02', '02.py']
>>>
返回的列表不分辨是文件还是子目录,可以用os.path.isdir() 或 isfile()判断:
>>> def isPath(f):
return '<DIR>' if os.path.isdir(f) else ''
>>> [(f+isPath(path+'\\'+f)) for f in os.listdir(path)]
['01<DIR>', '01.py', '02<DIR>', '02.py']
>>> def isPath(f):
return '' if os.path.isfile(f) else '<DIR>'
>>> [(f+isPath(path+'\\'+f)) for f in os.listdir(path)]
['01<DIR>', '01.py', '02<DIR>', '02.py']
也可以直接上表达式,不用自定义函数:
>>> [f+'<DIR>' if os.path.isdir(path+'\\'+f) else f for f in os.listdir(path)]
['01<DIR>', '01.py', '02<DIR>', '02.py']
>>> [f if os.path.isfile(path+'\\'+f) else f+'<DIR>' for f in os.listdir(path)]
['01<DIR>', '01.py', '02<DIR>', '02.py']
>>>
还能用listdir()返回子目录的文件数,如果出错返回-1表示文件(返回0表示是空目录):
>>> def isPath(path):
try:return len(list(os.listdir(path)))
except NotADirectoryError:return -1
>>> [isPath(path+'\\'+i) for i in os.listdir(path)]
[3, -1, 4, -1]
>>>
DOS命令 dir /a,参数/a表示列出隐藏属性的文件目录:
D:\>dir test
驱动器 D 中的卷是 文档
卷的序列号是 109A-0446
D:\test 的目录
2021/05/02 23:48 <DIR> .
2021/05/02 23:48 <DIR> ..
2021/05/02 22:56 <DIR> 01
2021/04/03 12:09 1,486 01.py
2021/05/02 22:56 <DIR> 02
2021/04/03 12:09 1,262 02.py
2021/05/02 23:48 <DIR> 03
2 个文件 2,748 字节
5 个目录 316,223,320,064 可用字节
四列分别是时间, 是否目录,文件大小,文件名
函数os.path.getctime(f) os.path.getatime(f) os.path.getmtime(f) 分别是攻取文件的创建create访问access修改modify的时间
经测试dir用的是os.path.getmtime(f),但返回的是时间戳:一个表示时间的浮点数
>>> f
'winMove1.py'
>>> os.path.getmtime(f)
1619789379.3554473
>>>
可以用time库的localtime() 和 strftime() 转成dir命令一样的格式:
import time
timeStruct = time.localtime(timestamp)
time.strftime('%Y/%m/%d %H:%M',timeStruct)
注: 年、小时、分钟要用大写字母 (%y为两位数年份;%h为英文月份;%m为数字月份)。
最后用os.path.getsize(f) 获取文件大小,再加os.path.isdir()和os.path.isfile()基本上几个要素齐全了
代码如下:
>>> import os,time
>>> files=filesizes=0
>>> path='d:\\test'
>>> fn=os.listdir(path)
>>> fn
['01', '01.py', '02', '02.py', '03']
>>> fdt=lambda t:time.strftime('%Y/%m/%d %H:%M',time.localtime(t))
>>> for f in fn:
f0=path+'\\'+f
f1=fdt(os.path.getmtime(f0))
filesize=os.path.getsize(f0)
f2=' <DIR>'.ljust(16) if os.path.isdir(f0) else format(filesize,',').rjust(16)
if os.path.isfile(f0):filesizes+=filesize;files+=1
print(f1,f2,f)
2021/05/02 22:56 <DIR> 01
2021/04/03 12:09 1,486 01.py
2021/05/02 22:56 <DIR> 02
2021/04/03 12:09 1,262 02.py
2021/05/02 23:48 <DIR> 03
>>> strsize=format(filesizes,',')
>>> print(u'\t所列文件总数:\n'+'\t'*3+f'{files}个文件\t\t{strsize}字节')
所列文件总数:
2个文件 2,748字节
>>>
注:.ljust(w),.rjust(w)字符串的左右对齐,若要居中则用.center(w),w为宽度。
还有卷、序列号、磁盘剩余字节数三个要素没有实现,其它的都模拟成功了。
注意,listdir()会把隐藏属性的也列出来,所以上述代码对应的是 dir /a
dir 还有一个常用参数 /s 是列出所有目录树的见文首列表,对应的是os.walk(path),另行撰文