如果条件满足,如何使用argparse.FileType打开文件?

时间:2015-04-12 21:22:39

标签: python python-3.x argparse

我正在使用python 3 argparse。我有多个文件作为argparse.FileType传递,我用它来写一些数据。我想检查一些条件,只有满足它们才能打开这些文件。但是,argparse会立即打开它们,即使我退出并显示错误代码,它们也会被创建。

import argparse
from sys import exit

def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('--condition', action='store_true')
    parser.add_argument('out1', type=argparse.FileType('w'))
    parser.add_argument('out2', type=argparse.FileType('w'))

    args = parser.parse_args()

    if not args.condition:
        print('ERROR: please use --condition')
        exit(2)

    args.out1.write('hello\n')
    args.out2.write('world\n')

if __name__ == '__main__':
    main()

如果我在没有传递--condition参数的情况下运行此示例,它仍将创建2个新文件。我不想在那种情况下创建它们。我可以不传递文件名并手动打开文件吗?

1 个答案:

答案 0 :(得分:2)

最简单的方法是只接受文件名作为默认字符串类型,然后再打开文件。

http://bugs.python.org/issue13824argparse.FileType opens a file and never closes it)实现了FileContext类型,其操作类似于FileType,但它返回的context可以在以后用作:

with args.input() as f:
    f.read()
    etc

但是在解析时进行文件名检查,而不是实际打开或创建文件,这并非易事。处理不应该关闭的stdin/out会增加复杂性。

在该bug问题中,argparse开发人员Steven Bethard指出FileType用于快速脚本,而不是适用于正确打开和关闭文件的大型项目。