2015-04-12 27 views
0

我正在使用python 3 argparse。我有多個文件作爲argparse.FileType傳遞,我用它來寫入一些數據。我想檢查一些條件並僅在符合條件時纔打開這些文件。然而,argparse會立即打開它們,即使我使用錯誤代碼退出,它們也會被創建。如何僅在條件滿足時才使用argparse.FileType打開文件?

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參數運行這個例子中,它仍然會創建兩個新的文件。在這種情況下,我不想創建它們。我可以做到這一點,而無需傳遞文件名並手動打開文件?

+0

如果你想做更具體的處理,不要使用'FileType';自己做。 – jonrsharpe

回答

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問題中,Steven Bethard,​​開發人員指出FileType用於快速腳本,而不適用於正確打開和關閉文件很重要的大型項目。