实现功能
- 实现ls 命令功能-l 、 -a 、 -a 和–all 、-h选项
- 显示路径下的文件列表
- -a 和–all 显示包含 “.”'开头的文件
- -l 显示详细列表显示
- -h 和 -l 配合, 个性化显示文件大小, 如1K, 1G, 1T,等, 可以按照1G = 1000M处理
- 类型字符
- c 字符
- d 目录
- 普通文件
- l 软连接
- b块设备
- s socket文件
- p pipe文件, 即FIFO
按照文件名排序输出, 要求详细列表显示时, 时间可以按照"年-月-日 时:分:秒"格式显示, 如下图
-rw-rw-r– | 1 | python | python | 5 | 2019 - 5 - 7 00:07:00 | test.txt |
---|---|---|---|---|---|---|
mode | 硬链接 | 属主 | 属组 | 字节 | 时间 | 文件名 |
解决这个问题之前先了解下argparse 模块做起来更轻松
argparse 模块
- 从3.2 版本开始Python 提供了参数分析的功能模块 - argparse, 解决给程序传递参数的问题
参数分类
一个可执行文件或者脚本都可以接收参数
$ ls -l /etc
# /etc 是位置参数
# -l 是短选项
- 位置参数 : 参数放在那里就要对应一个参数位置
- 选项参数 : 必须通过前面是 "-“的短选项或者”–"的长选项, 后面的才算该选项的参数, 当然选项后面也可以没有参数
上例中, /etc 对应的就是位置参数, -l 是选项参数
基本解析
import argparse
parser = argparse.ArgumentParser() # 获取参数解析器
args = parser.parse_args() # 分析参数
parser.print_help() # 打印帮助
运行结果
usage: Python.py [-h]
optional arguments:
-h, --help show this help message and exit
- argparse 不仅仅做了参数的定义和解析, 还自动生成了帮助信息尤其是usage , 可以看到现在定义的参数是否是自己想要的
解析器的参数
参数名称 | 说明 |
---|---|
prog | 程序的名字, 缺省使用sys.argv[0] 的basename |
add_help | 自动为解析器增加-h 和 --help 选项, 默认True |
description | 为程序增加描述 |
import argparse
parser = argparse.ArgumentParser(prog='ls', add_help=True, description='list directory contents')
args = parser.parse_args()
parser.print_help()
运行结果
usage: ls [-h]
list directory contents
optional arguments:
-h, --help show this help message and exit
感觉稍微有那么一点样子了 …
位置参数解析
考虑到ls 基本功能是解决目录内容打印, 打印的时候应该指定目录的路径, 需要位置参数
import argparse
parser = argparse.ArgumentParser(prog='ls', add_help=True, description='list directory contents') # 获取参数解析器
parser.add_argument('path')
args = parser.parse_args() # 分析参数
parser.print_help() # 打印帮助
运行结果
usage: ls [-h] path
ls: error: the following arguments are required: path
- 这里拿到的结果出现了错误, 但这个错误正好告诉我们需要输入path 对应的位置参数
- " ls [-h] path " 中-h 为帮助选项,可有可无, path 为位置参数, 必须提供, 下面我们解决传参问题 …
传参
parse_args(args=None, namespace=None)
args为参数列表, 是一个可迭代对象, 内部会把可迭代对象转成list . 如果为None 则使用命令行传入参数, 非None 则使用args 参数的可迭代对象
import argparse
parser = argparse.ArgumentParser(prog='ls', add_help=True, description='list directory contents') # 获取参数解析器
parser.add_argument('path') # 位置参数输入
args = parser.parse_args(('/etc', )) # 分析参数, 同时传入可迭代参数
print(args, args.path) # 打印名词空间收集的参数
parser.print_help() # 打印帮助
运行结果
Namespace(path='/etc') /etc
usage: ls [-h] path
list directory contents
positional arguments:
path
optional arguments:
-h, --help show this help message and exit
- Namespace(path=’/etc) 里面的path参数储存在了一个Namespace对象的属性上, 可以通过Namespace对象属性访问, 例如args.path
非必须位置参数
上面的代码必须输入位置参数, 否则会报错
usage: ls [-h] path
ls: error: the following arguments are required: path
有时候, ls 命令不输入任何路径的话就表示列出当前目录的文件列表
import argparse
parser = argparse.ArgumentParser(prog='ls', add_help=True, description='list directory contents') # 获取参数解析器
parser.add_argument('path', nargs='?', default='.', help='path help') # 增加缺省值路径, 帮助
args = parser.parse_args() # 分析参数, 同时传入可迭代参数
print(args, args.path) # 打印名词空间收集的参数
parser.print_help() # 打印帮助
运行结果
Namespace(path='.') .
usage: ls [-h] [path]
list directory contents
positional arguments:
path path help
optional