"force" 用户通过 argparse 使用特定文件扩展名的最佳方式是什么?

What is the best way to "force" users to use a certain file extension with argparse?

我有一个脚本,用户可以在其中包含输入和输出文件的路径名。

import argparse

parser = argparse.ArgumentParser()
parser.add_argument("i", help = "input path")
parser.add_argument("o", help = "output path")
args = parser.parse_args()
file_input = args.input
file_output = args.output

现在,我想确保用户创建的输出文件是文本文件,扩展名为 .txt

(1) 我可以通过错误告诉用户他们必须 使用 txt 扩展名。

(2) 我可以检查是否使用了 .txt 扩展名。如果没有,我会简单地添加它。

第一个相对容易:

import argparse

parser = argparse.ArgumentParser()
parser.add_argument("i", help = "input path")
parser.add_argument("o", help = "output path")
args = parser.parse_args()
file_input = args.input
file_output = args.output
if file_output.endswith("txt") != True:
    raise argparse.ArgumentTypeError('File must end in extension .txt!')

如何完成后者?

您可以定义一个 type 函数来添加所需的扩展名,例如

def txtname(astr):
    if not astr.endswith('.txt'):
        astr += '.txt'
    return astr

In [724]: parser=argparse.ArgumentParser()
In [725]: parser.add_argument('-i',type=txtname);
In [726]: parser.add_argument('-o',type=txtname);
In [728]: parser.parse_args(['-i','inname','-o','oname.txt'])
Out[728]: Namespace(i='inname.txt', o='oname.txt')

如果您不喜欢某些扩展名或文件名形式,该函数也可能引发 ValueError。