文件作为可选参数
我刚开始学Python,正在开发一个脚本,用来处理文件并进行一些计算。这个脚本(preprocess.py)在命令行中是这样调用的:
python preprocess.py if.txt of.txt 13 13 41 41 52 24
这里的if.txt是输入文件,of.txt是输出文件,(13 13 41 41 52 24)只是数据的组和子组的大小。
在脚本的某个部分,会用两个变量进行计算(mean=0和std=1)。
我需要修改这个脚本,让它可以接受一个可选的参数,也就是一个文件,这个文件里包含两个值(mean和std)。这样的话,如果脚本像上面那样调用,计算就用mean=0和std=1;但如果脚本这样调用:
python preprocess.py if.txt of.txt 13 13 41 41 52 24 xxxx.txt
那么脚本就会从xxxx.txt文件中读取这两个值,并把每个值分别存入对应的变量(mean和std)。
现在这个脚本是通过sys.argv[]
命令来获取参数的。我一直在寻找解决办法,发现argparse
模块可以解决这个问题,但我不太明白如何从文件中获取值并按预期保存。
如何使用argparse模块将xxxx.txt文件设置为可选参数,并如何将文件中的两个值保存到这两个变量(mean和std)中?
如果我使用argparse模块,是否应该用它来获取所有其他参数?如果是的话,应该怎么做?
附注:我也在学英语,所以如果我说错了,请纠正我。
2 个回答
另一种方法是为一个参数设置一个默认值,这个参数叫做命名参数。
def method(one, two, three=3):
print(one)
print(two)
if three != 3: # don't have to use it like this but it is a default value
print(three)
这样做的好处是,如果这个参数没有被填写,就会使用默认值;如果填写了,就会用你填写的值来替代默认值。
method(11, 22) # prints first two parameters
method(23, 54, 89) # prints all three
我不确定这是不是你想要的,但这确实是另一种方法。
如果整数的数量是固定的,那么这个脚本就可以正常工作。
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('file1')
parser.add_argument('file2')
parser.add_argument('vars', type=int, nargs=3)
parser.add_argument('file3',nargs='?')
print(parser.parse_args())
这里的'?'表示最后一个参数是可选的。
你可以用下面的方式接收多个整数:
parser.add_argument('vars', type=int, nargs='+')
不过,两个可变参数nargs不能一起使用。'+'会把所有的值都拿走,这样就没有剩下的给'?'了。
我建议把那个可选的文件参数设置为一个“可选/标记”的参数。通常情况下,可选参数就是这样处理的,这样可以避免在处理位置参数时的混淆。
parser.add_argument('--file3')
python preprocess.py if.txt of.txt 13 13 41 41 52 24 --file3 xxxx.txt
另一种不使用argparse
的方法是检查最后一个sys.argv
的值。如果它看起来不像一个int
,那么就可以假设它是文件名,然后像之前一样解析其他参数。