文件作为可选参数

1 投票
2 回答
1241 浏览
提问于 2025-04-18 14:55

我刚开始学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模块可以解决这个问题,但我不太明白如何从文件中获取值并按预期保存。

  1. 如何使用argparse模块将xxxx.txt文件设置为可选参数,并如何将文件中的两个值保存到这两个变量(mean和std)中?

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

附注:我也在学英语,所以如果我说错了,请纠正我。

2 个回答

0

另一种方法是为一个参数设置一个默认值,这个参数叫做命名参数

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

我不确定这是不是你想要的,但这确实是另一种方法。

1

如果整数的数量是固定的,那么这个脚本就可以正常工作。

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,那么就可以假设它是文件名,然后像之前一样解析其他参数。

撰写回答