我是python的新手。我正在编写一个计算单词,行和字符的程序。当我尝试使用命令行开关时,我开始遇到问题:-w,-l,-c,直到一切正常。
我阅读了有关argparse的stackoverflow和python文档的帖子,但我现在不知道如何实现argparse库以及与之一起使用的代码。
当我运行python wc.py file.txt --l
我得到了
要取消的值太多
有人可以帮帮我吗?
from sys import argv
import os.path
import argparse
script, filename = argv
def word_count(filename):
my_file = open(filename)
counter = 0
for x in my_file.read().split():
counter += 1
return counter
my_file.close()
def line_count(filename):
my_file = open(filename, 'r').read()
return len(my_file.splitlines())
my_file.close()
def character_count(filename):
my_file = open(filename, 'r').read()
return len(my_file)
my_file.close()
parser = argparse.ArgumentParser()
parser.add_argument('--w', nargs='+', help='word help')
parser.add_argument('--l', nargs='+', help='line help')
parser.add_argument('--c', nargs='+', help='character help')
args = parser.parse_args()
if os.path.exists(filename):
print word_count(filename), line_count(filename), character_count(filename)
else:
print "There is no such file"
答案 0 :(得分:4)
如果您使用argparse
进行参数解析,则不应尝试自己解析argv
:
script, filename = argv
如果argv
少于两个元素,则会失败:
Traceback (most recent call last):
File "wc.py", line 5, in <module>
script, filename = argv
ValueError: need more than 1 value to unpack
或如果更多而不是两个元素:
Traceback (most recent call last):
File "wc.py", line 5, in <module>
script, filename = argv
ValueError: too many values to unpack
您希望使用argparse
从参数列表中提取文件名:
parser.add_argument('filename')
您现有的命令行参数也可以使用一些修复。而不是:
parser.add_argument('--w', nargs='+', help='word help')
你想:
parser.add_argument('-w', action='store_true', help='word help')
这为您提供了一个布尔选项,如果用户通过-w
,则args.w
将为True
,否则为None
。这给你:
parser = argparse.ArgumentParser()
parser.add_argument('-w', action='store_true')
parser.add_argument('-c', action='store_true')
parser.add_argument('-l', action='store_true')
parser.add_argument('filename')
args = parser.parse_args()
if os.path.exists(args.filename):
print word_count(args.filename), line_count(args.filename), character_count(args.filename)
else:
print "There is no such file"
您可能还想提供长期等值的选项:
parser.add_argument('--words', '-w', action='store_true')
parser.add_argument('--characters', '-c', action='store_true')
parser.add_argument('--lines', '-l', action='store_true')
通过此更改,用户可以使用-w
或--words
。然后,您将拥有args.words
,args.characters
和args.lines
(而非args.w
,args.c
,args.l
)。