[toc]

python 日志处理一

练习

  • 实现ls 命令功能,实现-l、-a和 -all、 -h 选项
  1. 实现显示路径下的文件列表;
  2. -a和 -all显示包含.开头的文件;
  3. -l 详细列表显示;
  4. -h 和 -l 配合,人性化显示文件大小,例如1K、1G、1T等。可以认为1G=1000M;
  5. c 字符;d目录;-普通文件;l软链接;b块设备;s socket文件;p pip文件,即FIFO;
  6. -rw-rw-r– 1 python python 5 Oct 00:07 test4;
  7. mode 硬链接 属主 属组 字节 时间 文件名;
  8. 按照文件名排序输出,可以和ls的顺序不一样,但要求文件名排序;
  9. 要求详细列表显示时,时间可以按照”年-月-日 时:分:秒” 格式显示。

* argparse 模块

一个可执行文件或者脚本可以接收参数;

1
2
3
# ls -l /etc
/etc # 是位置参数
-l # 是短选项

如何把这些参数传递给程序呢 ?
从3.2开始Python提供了参数分析的argparse。

  • 参数分类

位置参数放在哪里,就要对应一个参数位置。例如/etc 就是对应一个参数位置;
选项参数,前面必须是通过-的短选项,或者-- 长选项, 然后后面的才算它的参数,当然短选项后面也可以没有参数;

上述中 ‘/etc’ 对应的是位置参数, -l 是选项参数;

基本目录的实现

1
2
3
4
5
6
7
8
9
10
11
#!/usr/bin/env python
from pathlib import Path

def showdir(path:str='.'):
p = Path(path)
for file in p.iterdir():
print(file.name)

if __name__ == '__main__':
showdir('/etc')

基本的解析

先来看一段最简单的程序

1
2
3
4
5
#!/usr/bin/env python 
import argparse
parser = argparse.ArgumentParser() # 获得一个参数解析器
args = parser.parse_args() # 分析参数
parser.help() # 打印帮助

打印结果

1
2
3
4
usage: if_not.py [-h]

optional arguments:
-h, --help show this help message and exit

argparse 不仅仅做了参数的定义和解析,还自动帮助生成了帮助信息。尤其是usage,可以看到定义参数是否是自己想要的;

解析器的参数

prog 程序的名字,缺省使用sys.argv[0]
add_help 自动解析增加-h 和–help 的选项,默认为True
description 为程序功能添加描述
parser = argparse.ArgumentParser(prog='ls',add_help=True,description='list directory contents')

位置参数解析

ls 基本功能应该解决目录内容的打印;
打印的时候应该指定目录的路径,需要位置参数

1
2
3
4
5
6
7
import argparse 
# 获得一个参数解析器
parser - argparse.ArgumentParser(prog='ls',add_help=True,description='list direct ory contents')
parser.add_argument('path')

args = parser.parse_args() # 分析参数
parser.print_help() # 打印帮助

程序等定义为:
ls [-h] path
-h为帮助,可有可无
path 为位置参数,必须提供

传参
parse_args(args=None, naespace=None)
args参数列表,一个可迭代对象,内部会把可迭代对象转换成list。如果为None 则使用命令行传入参数,非None则使用args参数的可迭代对象

非必须位置参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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) # 打印名词空间中收集的参数
parser.print_help() #打印帮助

运行结果
Namespace(path='/etc')
usage: ls [-h] path

list directory contents

positional arguents
path

optional arguments
-h, --help show this help message and exit

评论