【问题标题】:file as an optional parameter文件作为可选参数
【发布时间】:2014-07-27 02:35:47
【问题描述】:

我是 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)进行计算。

我必须修改脚本,以便脚本接受一个可选参数,一个包含 2 个值(mean 和 std)的文件,这样,如果像上面那样调用脚本,则计算是用 mean=0 进行的和 std=1,但如果脚本是这样调用的:

python preprocess.py if.txt of.txt 13 13 41 41 52 24 xxxx.txt 

脚本获取 xxxx.txt 文件中的两个值,并将每个值保存在其各自的变量(均值和标准差)中。

脚本现在使用sys.argv[] 命令获取参数。我一直在寻找解决这个问题的方法,发现argparse模块可以解决它但是我无法理解如何从文件中获取值并按预期​​保存。

  1. 如何使用 argparse 模块使 xxxx.txt 文件成为可选参数以及如何将该文件中的两个值保存在两个变量(mean 和 std)中?

  2. 如果我使用 argparse 模块,是否应该使用 argparse 来获取所有其他参数?如果有,该怎么做?

PD:我正在学习英语,所以如果我犯了错误,请纠正我。

【问题讨论】:

  • 你试过什么?你有尝试过吗?你被什么困住了?
  • 查看argparse tutorial。这很容易通过,应该可以帮助您入门。
  • 如果你不想使用 argparse 然后检查最后一个参数 - 如果你不能使用 int() 转换它那么它是文件名。

标签: python argparse optional-parameters


【解决方案1】:

如果 int 值的数量是固定的,那么这个脚本就可以工作

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='+')

但是,这 2 个变量 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,则假定它是文件名,然后像以前一样继续解析其余部分。

【讨论】:

  • 特别感谢 hpaulj 和 MattDMo。致詹姆斯:嗯,我在这里有大约 8 个tests.py,我试图在其中做一些事情来理解 argparse 模块(当然没有好的结果)。所以我不知道该放什么。但是,这就是我制作这个线程的原因。谢谢你的回答,下次我会放一些东西。致 furas:不错的提示,我稍后再试。致 MattDMo:谢谢你的 tut,我不知道。有了这个 tut 和 hpaulj 的回答,我实现了我想要的。
  • 这是我在输入参数后从 xxxx.txt 文件中提取值的操作:args = parser.parse.args() /// if args.file3: /// values = np.genfromtxt(args.file3) /// mean = values[0] /// std = values[1]
【解决方案2】:

另一种方法是为参数设置默认值,使用named parameter

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

不确定这是否是您要寻找的,但这是另一种方式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-02
    • 2014-08-05
    • 2012-05-22
    • 1970-01-01
    • 2015-08-12
    • 1970-01-01
    相关资源
    最近更新 更多