2012-09-07 25 views
2

我的腳本當前使用sys.argv來檢查提供給程序的輸入文件。使用'argparse'而不是sys.argv

我試圖利用​​,但我似乎無法使它工作。我能夠設置它並添加一個參數,但是當我解析一個參數並打印解析的參數時,我會得到一個名稱空間。我怎樣才能得到一個字符串?基本上,我想將參數作爲一個字符串,並打開一個名稱的文件。

目前,我sys.argv是:

filename = sys.argv[1] 
f = open(filename, 'r') 

我​​打印出一個Namespace如下:

arg = parser.parse_args() 
print arg 

我如何可以用它來打開一個文件?我想使用​​,因爲參數的錯誤標定比較容易。

回答

4

認爲其優選(或東西!)使用with聲明打開文件,如下所示:

# printfile.py 
import argparse 

parser = argparse.ArgumentParser(description="Opens a file and does cool stuff ^^") 
parser.add_argument('filename', type=str, help="Path to file to open") 
args = parser.parse_args() 

with open(args.filename) as f: 
    print ' my uber cool file:' 
    print f.readlines() 

指定那些關鍵字參數也有助於做一個漂亮的幫助文本選項(這是整齊整齊)

[[email protected]:~] $ python printfile.py -h 
usage: printfile.py [-h] filename 

Opens a file and does cool stuff ^^ 

positional arguments: 
    filename Path to file to open 
+0

這實際上解決了我要處理的錯誤處理問題(用'with'語句)。謝謝! – darksky

+1

'with'是一個上下文管理器。它保證(在假設解釋器本身內存在分段錯誤時),即當你退出上下文(即使有例外)時,用於創建上下文的對象將被正確地完成。換句話說,你的文件將被正確關閉,無論發生什麼事,這些資源都將被釋放。 – mgilson

2

打印arg後跟一個點,後面跟着您分配給​​設置中參數的名稱。

實施例:

parser = argparse.ArgumentParser(description = 'Title you want') 
parser.add_argument('-f', action = "store", dest = "fflag", type = str, help = "Filename to be used, stdin is default") 

在這種情況下,文件名稱將通過-f在命令行上之前,將可訪問由類型的parser.fflagstr

+0

所以argparse基本上把所有的參數放在一個字典?此外,這樣做並打印文件返回:<<打開文件'測試',模式'r'在0x1004e46f0>'。這是否意味着該文件已被argparse打開? – darksky

+0

@Darksky - 它實際上是一個自定義對象,而不是一個普通的字典。如果您將arg鍵入爲文件,則它會方便地爲您提供一個已打開的文件對象。如果你想,你可以輸入is as str,然後取回沒有文件驗證的字符串。 – jdi

+0

http://www.doughellmann.com/PyMOTW/argparse/這是我找到的一個很好的教程。你基本上設置你的參數,並將它們分配給變量,如果你想在程序中稍後訪問。我會用一個例子更新我的答案。 – squiguy