Python 搞定ls命令功能 - argparse 模块


实现功能

  1. 实现ls 命令功能-l 、 -a 、 -a 和–all 、-h选项
  2. 显示路径下的文件列表
  3. -a 和–all 显示包含 “.”'开头的文件
  4. -l 显示详细列表显示
  5. -h 和 -l 配合, 个性化显示文件大小, 如1K, 1G, 1T,等, 可以按照1G = 1000M处理
  6. 类型字符
    - 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
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值