python中ls是什么_使用Python代码实现Linux中的ls遍历目录命令的实例代码
一、写在前面
前几天在微信上看到这样一篇文章,链接为:https://www.jb51.net/it/692145.html,在这篇文章中,有这样一段话,吸引了我的注意:
在 Linux 中 ls 是一个使用频率非常高的命令了,可选的参数也有很多, 算是一条不得不掌握的命令。Python 作为一门简单易学的语言,被很多人认为是不需要认真学的,或者只是随便调个库就行了,那可就真是小瞧 Python 了。那这次我就要试着用 Python 来实现一下 Linux 中的 ls 命令, 小小地证明下 Python 的不简单!
二、ls简介
Linux ls 命令用于显示指定工作目录下的内容。语法如下:
ls [-alkrt] [name]
这里只列举了几个常用的参数,ls 命令的可选参数还是很多的,可以使用 man ls 来进行查看具体信息。这里列出的几个参数对应含义如下:
1)-a:显示所有文件及目录;
2)-l:除文件名称外,亦将文件大小、创建时间等信息列出;
3)-k:将文件大小以 KB 形式表示;
4)-r:将文件以相反次序排列;
5)-t:将文件以修改时间次序排列。
三、具体思路
主要使用的模块是 argparse 和 os,其中 argparse 模块能设置和接收命令行参数,也就使得 Python 对命令行的操作变得简单,而 os 模块则用于文件操作,对 argparse 模块不熟悉的可以在这里查看官方文档。
既然要用 Python 实现 ls.py, 也就要在命令行中进行操作,比如 python ls.py -a 这样的命令,而对 Python 比较熟悉的人可能会想到使用 sys 模块来接收输入的命令,但使用 argparse 能让命令行操作变得更加简单!首先要导入模块并创建一个 ArgumentParser 对象,可以理解为一个解析器,然后就可以通过使用 add_argument() 方法为这个解析器添加参数了。示例如下:
# test.py
import argparse
parser = argparse.ArgumentParser(description='Find the maximum number.')
parser.add_argument("integers", type=int, nargs="+", help="The input integers.")
parser.add_argument("-min", nargs="?", required=False, dest="find_num", default=max, const=min,
help="Find the minimum number(Default: find the maximum number).")
args = parser.parse_args()
print(args)
print(args.find_num(args.Nums))
这段代码的功能是输入一到多个整数,默认求其中的最大值,若有 -min 参数则是求其中的最小值。可以看到在创建解析器和添加命令行参数的时候都设置了 description 描述信息,这个信息会在我们使用 --help 命令的时候显示出来,例如:
在上面的代码中,需要注意的是其中使用 add_argument() 添加了一个位置参数 "integers" 和一个可选参数 "-min",位置参数在命令行中必须存在,不可遗漏,也就不能设置 required 参数了,而可选参数就不是必须要有的了,因而还可以使用 default 参数设置默认值。nargs 参数用于设置命令行参数的数量,"+" 表示一个或多个,"?" 表示零个或一个,这里由于输入的数字可能有多个,所以要设置为 "+"。最终运行示例如下:
> python test.py 1 3 5
Namespace(find_num=, integers=[1, 3, 5])
5
> python test.py 1 3 5 -min
Namespace(find_num=, integers=[1, 3, 5])
1
关于 argparse 的介绍就到此为止了,下面简单介绍下 os 模块, os 模块提供了便捷的使用操作系统相关功能的方式,实现 ls.py 所用到的该模块下的方法包括:
1)os.path.isdir(path):若 path 是一个存在的目录,返回 True。
2)os.listdir(path):返回一个列表,其中包括 path 对应的目录下的内容,不包含“.”和“..”,即使它们存在。
3)os.stat(path):获取文件或文件描述符的状态,返回一个 stat_result 对象,其中包含了各种状态信息。
四、主要代码
ls.py 中的主函数如下,主要功能为创建解析器,设置可选参数和位置参数,然后接收命令行参数信息,并根据输入的参数调用相应的方法,这里设置了一个 "-V" 参数用于显示版本信息,可以使用 "-V" 或者 "-Version" 进行查看。
def main():
"""
主函数,设置和接收命令行参数,并根据参数调用相应方法
:return:
"""
# 创建解析器
parse = argparse.ArgumentParser(description="Python_ls")
# 可选参数
parse.add_argument("-a", "-all", help="Show all files", action="store_true", required=False)
parse.add_argument("-l", "-long", help="View in long format", action="store_true", required=False)
parse.add_argument("-k", help="Expressed in bytes", action="store_true", required=False)
parse.add_argument("-r", "-reverse", help="In reverse order", action="store_true", required=False)
parse.add_argument("-t", help="Sort by modified time", action="store_true", required=False)
parse.add_argument("-V", "-Version", help="Get the version", action="store_true", required=False)
# 位置参数
parse.add_argument("path", type=str, help="The path", nargs="?")
# 命令行参数信息
data = vars(parse.parse_args())
assert type(data) == dict
if data["V"]:
print("Python_ls version: 1.0")
return
else:
check_arg(data)
然后是一个获取指定路径下的内容信息的函数,要做的就是判断路径是否存在,若存在就返回一个文件列表,若不存在则显示错误信息,并退出程序。
def get_all(path):
"""
获取指定路径下的全部内容
:param path: 路径
:return:
"""
if os.path.isdir(path):
files = [".", ".."] + os.listdir(path)
return files
else:
print("No such file or directory")
exit()
五、运行结果
下面是 ls.py 运行后的部分结果截图。
首先是 python ls.py -a,这里并没有输入路径,就会使用默认路径即当前目录,如下图:
然后是 python ls.py -a -t .,使用该命令会显示当前目录下的所有内容,并按照创建的时间进行排序,如下图:
最后是 python ls.py -a -l -k -r .,也是显示当前目录下的所有内容并按照创建名称排序,不过这次文件大小会以 KB 为单位来显示,如下图:
到这里为止,ls.py 就算是基本实现了,当然还是有很多可以去实现的功能的,比如更多的参数等等,如果你感兴趣的话可以自己尝试一下==
完整python代码
"""
Version: Python3.7
Author: OniOn
Site: http://www.cnblogs.com/TM0831/
Time: 2019/9/6 21:41
"""
import os
import time
import argparse
import terminaltables
def get(path):
"""
获取指定路径下的内容
:param path: 路径
:return:
"""
if os.path.isdir(path): # 判断是否是真实路径
files = os.listdir(path)
return files
else:
print("No such file or directory")
exit()
def get_all(path):
"""
获取指定路径下的全部内容
:param path: 路径
:return:
"""
if os.path.isdir(path):
files = [".", ".."] + os.listdir(path)
return files
else:
print("No such file or directory")
exit()
def check_arg(data):
"""
检查参数信息
:param data: 命令行参数(dict)
:return:
"""
assert type(data) == dict
if not data["path"]:
data["path"] = "."
# a参数
if data["a"]:
files = get_all(data["path"])
else:
files = get(data["path"])
# r参数
if data["r"]:
files = files[::-1]
# t参数
if data["t"]:
files = sorted(files, key=lambda x: os.stat(x).st_mtime)
for i in range(len(files)):
files[i] = [files[i], time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(os.stat(files[i]).st_mtime))]
# l参数
if data["l"]:
result = []
for i in range(len(files)):
file = files[i][0] if data["t"] else files[i]
# 获取文件信息
file_info = os.stat(file)
# k参数
if data["k"]:
# 格式化时间,文件大小用KB表示
result.append([file, time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(file_info.st_ctime)),
"%.3f KB" % (file_info.st_size / 1024)])
else:
# 格式化时间,文件大小用B表示
result.append([file, time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(file_info.st_ctime)),
"{} Byte".format(file_info.st_size)])
if data["t"]:
for i in result:
i.append(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(os.stat(i[0]).st_mtime)))
show_file(result, True, True) if data["t"] else show_file(result, True, False)
return
show_file(files, False, True) if data["t"] else show_file(files, False, False)
def show_file(files, has_l, has_t):
"""
格式化输出文件信息
:param files: 文件列表
:param has_l: 是否有l参数
:param has_t: 是否有t参数
:return:
"""
# 根据参数信息设置表头
if not has_l:
if not has_t:
table_data = [["ID", "FILE_NAME"]]
for i in range(len(files)):
table_data.append([i + 1, files[i]])
else:
table_data = [["ID", "FILE_NAME", "FILE_MTIME"]]
for i in range(len(files)):
table_data.append([i + 1] + files[i])
else:
if not has_t:
table_data = [["ID", "FILE_NAME", "FILE_CTIME", "FILE_SIZE"]]
else:
table_data = [["ID", "FILE_NAME", "FILE_CTIME", "FILE_SIZE", "FILE_MTIME"]]
for i in range(len(files)):
table_data.append([i + 1] + files[i])
# 创建AsciiTable对象
table = terminaltables.AsciiTable(table_data)
# 设置标题
table.title = "file table"
for i in range(len(table.column_widths)):
if i != 1:
# 居中显示
table.justify_columns[i] = "center"
print(table.table)
def main():
"""
主函数,设置和接收命令行参数,并根据参数调用相应方法
:return:
"""
# 创建解析器
parse = argparse.ArgumentParser(description="Python_ls")
# 可选参数
parse.add_argument("-a", "-all", help="Show all files", action="store_true", required=False)
parse.add_argument("-l", "-long", help="View in long format", action="store_true", required=False)
parse.add_argument("-k", help="Expressed in bytes", action="store_true", required=False)
parse.add_argument("-r", "-reverse", help="In reverse order", action="store_true", required=False)
parse.add_argument("-t", help="Sort by modified time", action="store_true", required=False)
parse.add_argument("-V", "-Version", help="Get the version", action="store_true", required=False)
# 位置参数
parse.add_argument("path", type=str, help="The path", nargs="?")
# 命令行参数信息
data = vars(parse.parse_args())
assert type(data) == dict
if data["V"]:
print("Python_ls version: 1.0")
return
else:
check_arg(data)
if __name__ == '__main__':
main()
完整代码已上传到GitHub!
python中ls是什么_使用Python代码实现Linux中的ls遍历目录命令的实例代码相关推荐
- python中ls是什么_使用python实现ls命令(1)
打算用python写一个ls命令脚本,以练习python基础.这个文档就是记录该小项目的进展和学习心得. ls是Linux下最常用的命令之一,可以列出目录内文件即子目录名,可以配合众多参数使用.为此专 ...
- python文本结构化处理_在Python中标记非结构化文本数据
python文本结构化处理 Labelled data has been a crucial demand for supervised machine learning leading to a n ...
- 不属于python标准库的是_《Python Cookbook(第2版)中文版》——1.10 过滤字符串中不属于指定集合的字符-阿里云开发者社区...
本节书摘来自异步社区<Python Cookbook(第2版)中文版>一书中的第1章,第1.10节,作者[美]Alex Martelli , Anna Martelli Ravenscro ...
- python中基本程序结构_关于Python 程序格式框架的描述,正确的是( )
[判断题]元组的元素是可读的,可以对元组进行更新.增加.删除操作. [多选题]哪些选项关于循环结构的描述是正确的( ) [单选题]以下可以终结一个循环的是 . [判断题]对于大量列表的连接,exten ...
- python使用函数的目的_在Python 3.x中经常看到定义函数有一个单独的 * 参数?定义这样参数的目的是?怎样对其取值呢?...
参数在python中总是通过赋值进行传递的.在默认情况下,参数是通过其位置进行匹配的,从左到右,而且必须精确的传递和函数头部参数名一样多的参数. 这种默认的传递方式很简单 def f(a,b,c): ...
- python中类似对象吗_在Python中,两个对象什么时候相同? - python
似乎2 is 2和3 is 3在python中始终为true,通常,对整数的任何引用都与对相同整数的任何其他引用相同. None(即None is None)也是如此.我知道用户定义类型或可变类型不会 ...
- python中nomodulenamed怎么解决_关于 python ImportError: No module named 的问题
今天在 centos 下安装 python setup.py install 时报错:ImportError: No module named sysconfig, 当时急着用,就顺手直接源码编译了一 ...
- 基于python的语料库数据处理电子版_基于 Python 自然语言处理工具包在语料库研究中的运用...
基于 Python 自然语言处理工具包在语料库研究中的运用 刘 旭 [摘 要] 摘要:国内当前以语料库为基础的研究,在研究工具方面,多以 AntConc . PowerGREP 为主,使用 Pytho ...
- python控制语句中的条件语句_『Python』条件控制语句
Loading... ## 1. 条件语句 ``` Python条件语句是通过一条或者多条语句的执行结果(True或False)来决定执行的代码块. ``` ``` 在Python中, 指定任何非0和 ...
最新文章
- delphi oracle新建用户,Delphi 中如何用另外一个用户的身份来运行一人程序
- ISAPI_Rewrite规则
- c/c++面试试题(二)
- linux 查看目录下文件个数
- 作者:陈兴鹏(1963-),男,兰州大学资源环境学院教授、博士生导师。
- 用 Python 制作关不掉的端午安康弹窗
- quidway secpath下搭建DHCP服务器01
- Mysql DDL与DML
- SQL技巧——行转列/列转行
- 更新应用程序安卓apk时出现解析程序包时出现问题
- 摩托车挡板防碎膜-安全骑行好伴侣
- layui中table表格内容过多自动换行
- 如何屏蔽谷歌浏览器的账号密码自动填充和账号密码选择
- 怎么打印加密的PDF文件?
- 算法设计与分析(python版)-作业三
- c32循迹小车c语言程序,STM32小车红外黑线循迹源程序
- Unity 获得Animator下某个动画片段的时长
- 【转载】5年内从3500元到700万的过程,有爱情、有奋斗、有。。。泪水
- IDEA在创建包时如何把包分开实现自动分层
- java-php-python-ssm药房管理系统计算机毕业设计
热门文章
- AtCoder Regular Contest 063 E - Integers on a Tree 构造 + 二分图染色
- Find 3-friendly Integers
- CodeForces - 1189B Number Circle
- P2048 [NOI2010] 超级钢琴(RMQ 贪心)
- YbtOJ#20082-[NOIP2020模拟赛B组Day8]导出子图【dp】
- jzoj3919-志愿者【换根法,线段树,树形dp】
- P2514-[HAOI2010]工厂选址【贪心】
- 2019.01.26【NOIP普及组】模拟赛C组总结
- SpringBoot2.1.9 Mybatis多数据源配置
- 如何轻松愉快的理解条件随机场(CRF)