gpt4 book ai didi

python - 我必须为 argparse.FileType 指定什么模式来追加,保持 - 作为默认值

转载 作者:太空宇宙 更新时间:2023-11-03 15:20:05 27 4
gpt4 key购买 nike

我必须用这个命令行写一个程序:

demo.py [-h] -f FILENAME [-o]

文件名是强制性的,表示我们要附加到的文件。 -o 标志表示文件将被覆盖。

这个 argparse 代码几乎可以工作:

import argparse

parser = argparse.ArgumentParser(description='A foo that bars')

parser.add_argument("-f",
"--file", dest="filename", required=True,
type=argparse.FileType('a+'),
help="The output file (append mode, see --overwrite).")

parser.add_argument("-o",
"--overwrite", dest="overwrite",
action='store_true',
help="Will overwrite the filename if it exists")

args = parser.parse_args()

if args.overwrite:
args.filename.truncate(0)

print >> args.filename, 'Hello, World!'

但是如果我指定 - (stdout) 作为文件名,我会得到这个错误:

error: argument -f/--file: invalid FileType('a+') value: '-'

我试过 ar+,我得到了同样的错误。我在 Windows 上使用 Python 2.7,但它也必须在 Linux 上运行。不能更改命令行以获得旧版支持。

如何保持 argparse 对 stdout 简写的内置支持,但支持覆盖功能?

最佳答案

argparse.FileType.__call__ 包含此代码:

    if string == '-':
if 'r' in self._mode:
return _sys.stdin
elif 'w' in self._mode:
return _sys.stdout
else:
msg = _('argument "-" with mode %r') % self._mode
raise ValueError(msg)

因此,如果 self._mode'a+',Python 会引发 ValueError。您可以通过子类化 argparse.FileType 来解决这个问题:

import argparse
import sys as _sys

class MyFileType(argparse.FileType):

def __call__(self, string):
# the special argument "-" means sys.std{in,out}
if string == '-':
if 'r' in self._mode:
return _sys.stdin
elif any(m in self._mode for m in 'wa'):
return _sys.stdout
else:
msg = _('argument "-" with mode %r') % self._mode
raise ValueError(msg)

# all other arguments are used as file names
try:
return open(string, self._mode, self._bufsize)
except IOError as e:
message = _("can't open '%s': %s")
raise ArgumentTypeError(message % (string, e))


def parse_options():
parser = argparse.ArgumentParser(description='A foo that bars')

parser.add_argument("-f",
"--file", dest="filename", required=True,
type=MyFileType('a+'),
help="The output file (append mode, see --overwrite).")

parser.add_argument("-o",
"--overwrite", dest="overwrite",
action='store_true',
help="Will overwrite the filename if it exists")

args = parser.parse_args()

if args.overwrite:
args.filename.truncate(0)
return args

args = parse_options()
print >> args.filename, 'Hello, World!'

关于python - 我必须为 argparse.FileType 指定什么模式来追加,保持 - 作为默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16365297/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com