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),另行撰文



目录
相关文章
|
1月前
|
Windows
DOS 批处理 setlocal命令、endlocal命令详解
DOS 批处理 setlocal命令、endlocal命令详解
43 10
|
1月前
|
Windows
DOS 批处理 setlocal命令、endlocal命令详解
setlocal这是一个命令,它开始局部化环境更改,通常在批处理文件中使用,以确保在脚本中所做的任何环境更改(例如设置或修改环境变量)不会影响到调用此批处理的上下文或其他批处理文件
65 14
|
2月前
|
Java Windows
JAVA 常用的 DOS 命令
【10月更文挑战第15天】DOS 命令是 Java 开发中不可或缺的工具,掌握这些命令可以提高开发效率和操作便利性。
43 3
|
1月前
|
JavaScript 前端开发 Python
python中的OS模块的基本使用
欢迎来到瑞雨溪的博客,一名热爱JavaScript与Vue的大一学生。博客分享前端技术及全栈开发经验,持续更新中,期待您的关注和支持!🎉🎉🎉
35 0
|
2月前
|
Python
Python实用记录(四):os模块-去后缀或者改后缀/指定目录下图片或者子目录图片写入txt/csv
本文介绍了如何使用Python的os模块来操作文件,包括更改文件后缀、分割文件路径和后缀、将指定目录下的所有图片写入txt文档,以及将指定目录下所有子目录中的图片写入csv文档,并为每个子目录分配一个标签。
28 1
|
2月前
|
Shell Python
Python中os模块的常用方法和示例
在Python中,`os`模块提供了与操作系统交互的函数,用于文件和目录管理、路径操作、环境变量等。常用方法包括路径操作(如`os.path.join()`、`os.path.abspath()`)、文件和目录管理(如`os.mkdir()`、`os.remove()`)、环境变量和进程管理(如`os.getenv()`、`os.system()`)以及其他常用功能(如`os.getcwd()`、`os.urandom()`)。
38 0
|
1月前
|
安全 Linux 数据安全/隐私保护
Vanilla OS:下一代安全 Linux 发行版
【10月更文挑战第30天】
59 0
Vanilla OS:下一代安全 Linux 发行版
|
1月前
|
NoSQL Linux PHP
如何在不同操作系统上安装 Redis 服务器,包括 Linux 和 Windows 的具体步骤
本文介绍了如何在不同操作系统上安装 Redis 服务器,包括 Linux 和 Windows 的具体步骤。接着,对比了两种常用的 PHP Redis 客户端扩展:PhpRedis 和 Predis,详细说明了它们的安装方法及优缺点。最后,提供了使用 PhpRedis 和 Predis 在 PHP 中连接 Redis 服务器及进行字符串、列表、集合和哈希等数据类型的基本操作示例。
59 4
|
1月前
|
人工智能 安全 Linux
|
2月前
|
Unix 物联网 大数据
操作系统的演化与比较:从Unix到Linux
本文将探讨操作系统的历史发展,重点关注Unix和Linux两个主要的操作系统分支。通过分析它们的起源、设计哲学、技术特点以及在现代计算中的影响,我们可以更好地理解操作系统在计算机科学中的核心地位及其未来发展趋势。