Python 使用os库函数listdir() 模拟DOS命令dir

简介: Python 使用os库函数listdir() 模拟DOS命令dir

为测试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命令一样的格式:

1. import time
2. timeStruct = time.localtime(timestamp)
3. 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),另行撰文



目录
相关文章
|
9月前
|
存储 人工智能 测试技术
如何使用LangChain的Python库结合DeepSeek进行多轮次对话?
本文介绍如何使用LangChain结合DeepSeek实现多轮对话,测开人员可借此自动生成测试用例,提升自动化测试效率。
2102 125
如何使用LangChain的Python库结合DeepSeek进行多轮次对话?
|
9月前
|
监控 数据可视化 数据挖掘
Python Rich库使用指南:打造更美观的命令行应用
Rich库是Python的终端美化利器,支持彩色文本、智能表格、动态进度条和语法高亮,大幅提升命令行应用的可视化效果与用户体验。
838 0
|
8月前
|
数据可视化 关系型数据库 MySQL
【可视化大屏】全流程讲解用python的pyecharts库实现拖拽可视化大屏的背后原理,简单粗暴!
本文详解基于Python的电影TOP250数据可视化大屏开发全流程,涵盖爬虫、数据存储、分析及可视化。使用requests+BeautifulSoup爬取数据,pandas存入MySQL,pyecharts实现柱状图、饼图、词云图、散点图等多种图表,并通过Page组件拖拽布局组合成大屏,支持多种主题切换,附完整源码与视频讲解。
796 4
【可视化大屏】全流程讲解用python的pyecharts库实现拖拽可视化大屏的背后原理,简单粗暴!
|
8月前
|
传感器 运维 前端开发
Python离群值检测实战:使用distfit库实现基于分布拟合的异常检测
本文解析异常(anomaly)与新颖性(novelty)检测的本质差异,结合distfit库演示基于概率密度拟合的单变量无监督异常检测方法,涵盖全局、上下文与集体离群值识别,助力构建高可解释性模型。
593 10
Python离群值检测实战:使用distfit库实现基于分布拟合的异常检测
|
10月前
|
运维 Linux 开发者
Linux系统中使用Python的ping3库进行网络连通性测试
以上步骤展示了如何利用 Python 的 `ping3` 库来检测网络连通性,并且提供了基本错误处理方法以确保程序能够优雅地处理各种意外情形。通过简洁明快、易读易懂、实操性强等特点使得该方法非常适合开发者或系统管理员快速集成至自动化工具链之内进行日常运维任务之需求满足。
654 18
|
10月前
|
机器学习/深度学习 API 异构计算
JAX快速上手:从NumPy到GPU加速的Python高性能计算库入门教程
JAX是Google开发的高性能数值计算库,旨在解决NumPy在现代计算需求下的局限性。它不仅兼容NumPy的API,还引入了自动微分、GPU/TPU加速和即时编译(JIT)等关键功能,显著提升了计算效率。JAX适用于机器学习、科学模拟等需要大规模计算和梯度优化的场景,为Python在高性能计算领域开辟了新路径。
949 0
JAX快速上手:从NumPy到GPU加速的Python高性能计算库入门教程
|
10月前
|
数据采集 存储 Web App开发
Python爬虫库性能与选型实战指南:从需求到落地的全链路解析
本文深入解析Python爬虫库的性能与选型策略,涵盖需求分析、技术评估与实战案例,助你构建高效稳定的数据采集系统。
744 0
|
10月前
|
存储 监控 安全
Python剪贴板监控实战:clipboard-monitor库的深度解析与扩展应用
本文介绍了基于Python的剪贴板监控技术,结合clipboard-monitor库实现高效、安全的数据追踪。内容涵盖技术选型、核心功能开发、性能优化及实战应用,适用于安全审计、自动化办公等场景,助力提升数据管理效率与安全性。
327 0