2012-10-19 59 views
2

有沒有辦法使用​​來對文件類型檢查文件名參數?似乎可以通過類型或選擇關鍵字來完成,如果我可以創建正確類型的容器對象。文件類型檢查參數傳遞給python腳本

如果文件不是正確的類型(.txt),我預計會傳入一個文件類型(例如,file.txt),並希望​​發送自動消息。例如,argparse可能輸出

usage: PROG --foo filename etc... error: argument filename must be of type *.txt. 

也許來代替檢測錯誤的文件類型,我們可以嘗試以檢測文件名字符串不與「.TXT」結束但這需要一個複雜的容器對象。

+0

options.foo.endswith( 「TXT」)或測試mime類型。你也應該看看docopt https://github.com/docopt/docopt – locojay

回答

4

可以使用type=關鍵字來指定自己的類型轉換器;如果你的文件名不正確,拋出一個ArgumentTypeError

import argparse 

def textfile(value): 
    if not value.endswith('.txt'): 
     raise argparse.ArgumentTypeError(
      'argument filename must be of type *.txt') 
    return value 

類型轉換器不將該值轉換..

parser.add_argument('filename', ..., type=textfile) 
+0

也許這只是我挑剔,但我更喜歡這些事情的行動,因爲你正在採取*行動*基於輸入 - 你沒有轉換*類型*。也就是說,這是一個完全可行的解決方案(並且實現起來可能比我的稍微簡單)(+1)。 – mgilson

+1

@mgilson:嗯,'type'可調用具有兩個功能:驗證和參數類型的轉換。在這種情況下,我們只驗證,因爲不需要轉換;輸入已經是正確的蟒蛇類型.. –

+0

@mgilson我認爲使用類型更合適,更容易和更少的可能的副作用,使用行動需要你瞭解argparse的內部機制,並打電話setattr –

2

肯定。您可以創建自定義操作:

class FileChecker(argparse.Action): 
    def __init__(self,parser,namespace,filename,option_string=None): 
     #code here to check the file, e.g... 
     check_ok = filename.endswith('.txt') 
     if not check_ok: 
      parser.error("useful message here") 
     else: 
      setattr(namespace,self.dest,filename) 

,然後你使用它作爲action

parser.add_argument('foo',action=FileChecker) 
1

我通常使用的「類型」參數做這樣的檢查

import argparse 

def foo_type(path): 
    if not path.endswith(".txt"): 
     raise argparse.ArgumentTypeError("Only .txt files allowed") 
    return path 

parser = argparse.ArgumentParser() 
parser.add_argument('--foo', help='foo help', type=foo_type) 
args = parser.parse_args() 

例如:

$ python argp.py --foo not_my_type 
usage: argp.py [-h] [--foo FOO] 
argp.py: error: argument --foo: Only .txt files allowed 
+0

是不是和@MartijnPieters的答案一樣嗎? – mgilson

+0

是,但是當我張貼,沒有回答這個問題:( –