Python命令行参数解析示例

最新需要一个小程序实现解析命令行参数、遍历指定文件夹,处理指定扩展名的文件。于是简单用python实现一下。

库选择

参数解析

sys.argv

解析Python中命令行参数的最传统的方法是通过sys.argv。但这种方法比较古老,灵活性很差,同时解析出来的参数都是str类型。但在编写简单脚本,参数较少且固定时比较方便。

getopt模块

getopt模块是专门处理命令行参数的模块,用于获取命令行选项和参数,也就是sys.argv。命令行选项使得程序的参数更加灵活。支持短选项模式(-)和长选项模式(–)。

optparse模块

optparse,功能强大,易于使用,可以方便地生成标准的、符合Unix/Posix 规范的命令行说明。但在Python2.7后就已经弃用不再维护。

argparse模块

argparse模块是Python内置的参数解析模块,使用起来比较简单且功能强大。

ArgumentParser类创建时的参数如下:

  • prog - 程序的名字(默认:sys.argv[0])
  • usage - 描述程序用法的字符串(默认:从解析器的参数生成)
  • description - 参数帮助信息之前的文本(默认:空)
  • epilog - 参数帮助信息之后的文本(默认:空)
  • parents - ArgumentParser 对象的一个列表,这些对象的参数应该包括进去
  • formatter_class - 定制化帮助信息的类
  • prefix_chars - 可选参数的前缀字符集(默认:‘-‘)
  • fromfile_prefix_chars - 额外的参数应该读取的文件的前缀字符集(默认:None)
  • argument_default - 参数的全局默认值(默认:None)
  • conflict_handler - 解决冲突的可选参数的策略(通常没有必要)
  • add_help - 给解析器添加-h/–help 选项(默认:True)

add_argument函数的参数如下:

  • name or flags - 选项字符串的名字或者列表,例如foo 或者-f, –foo。
  • action - 在命令行遇到该参数时采取的基本动作类型。
  • nargs - 应该读取的命令行参数数目。
  • const - 某些action和nargs选项要求的常数值。
  • default - 如果命令行中没有出现该参数时的默认值。
  • type - 命令行参数应该被转换成的类型。
  • choices - 参数可允许的值的一个容器。
  • required - 该命令行选项是否可以省略(只针对可选参数)。
  • help - 参数的简短描述。
  • metavar - 参数在帮助信息中的名字。
  • dest - 给parse_args()返回的对象要添加的属性名称。

参数解析模块比较

  • getopt,只能简单的处理命令行参数,无法解析一个参数多个值的情况,如 –file file1 file2 file3。
  • optparse,功能强大,易于使用,可以方便地生成标准的、符合Unix/Posix 规范的命令行说明。但在Python2.7后就已经弃用不再维护。
  • argparse,使其更加容易的编写用户友好的命令行接口。它所需的程序进程了参数定义,argparse将更好的解析sys.argv。同时argparse模块还能自动生成帮助及用户输入错误参数时的提示信息。

文件夹遍历

文件夹遍历有两种方法:

  • 使用os.walk
1
2
3
4
5
6
7
8
9
# -*- coding: utf-8 -*- 
import os
def Test1(rootDir):
list_dirs = os.walk(rootDir)
for root, dirs, files in list_dirs:
for d in dirs:
print os.path.join(root, d)
for f in files:
print os.path.join(root, f)
  • 使用os.listdir
1
2
3
4
5
6
7
8
# -*- coding: utf-8 -*- 
import os
def Test2(rootDir):
for lists in os.listdir(rootDir):
path = os.path.join(rootDir, lists)
print path
if os.path.isdir(path):
Test2(path)

文件处理

Python内置了读写文件的函数,用法和C是兼容的。本节介绍内容大致有:文件的打开/关闭、文件对象、文件的读写等。

代码示例

示例代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# -*- coding: utf-8 -*- 

import os
import argparse

# 遍历文件夹
def traverse(pathName,extName):
extNameList=extName.split(' ')
print(extNameList)
list_dirs = os.walk(pathName)
for root, dirs, files in list_dirs:
for f in files:
targetExt=os.path.splitext(f)[-1]
if targetExt.lower() in extNameList:
clearWaterPrint(os.path.join(root, f))

def clearWaterPrint(fileName):
print(fileName)
fileOrgin=open(fileName,'rb')
fileTarget=open(fileName+'.exe','wb')
fileTarget.write(fileOrgin.read())
fileOrgin.close()
os.remove(fileName)
fileTarget.close()
os.rename(fileName+'.exe',fileName)

# Driver Code
if __name__ == '__main__':
# 首先创建一个ArgumentParser对象
parser = argparse.ArgumentParser(description='Process the water print!')
# 添加--path设置文件目录
parser.add_argument('-p','--path', type = str,dest='pathName', help='give the path of directory',
default = './')
# 添加--ext设置文件目录
parser.add_argument('-e','--ext', type = str,dest='extName', help='give the extension name of file',
default = '.doc .docx .wav .txt .xml .dot .html .jpg .png',nargs = '*')
#返回一个命名空间,如果想要使用变量,可用args.attr
args = parser.parse_args()

# Calling traverse() function
traverse(args.pathName,args.extName)

使用方法如下:

1
2
python3 clearWaterPrint.py -h
python3 clearWaterPrint.py -p /home/test -e .doc .ppt

参考链接

  1. Python的命令行参数解析,by Tyan.
  2. Python中最好用的命令行参数解析工具,by Mingle Wong.
  3. Python遍历文件夹的两种方法比较,by likecao.
  4. 读写字节数据,by python3-cookbook.
  5. 读写二进制文件,by funhacks.