python-我必须为argparse.FileType指定哪种模式以追加,保留-默认
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python-我必须为argparse.FileType指定哪种模式以追加,保留-默认,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2229字,纯文字阅读大概需要4分钟。
内容图文
我必须使用以下命令行编写程序:
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: '-'
我尝试了a或r,我得到了同样的错误.我在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指定哪种模式以追加,保留-默认全部内容,希望文章能够帮你解决python-我必须为argparse.FileType指定哪种模式以追加,保留-默认所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。