2009-10-29 25 views
4

我想在一個循環如何測試多個命令行參數(sys.argv中

> python Read_xls_files.py group1 group2 group3 

沒有這個代碼測試只對第一個(組1)測試反對票多個命令行參數。

hlo = [] 
for i in range(len(sh.col_values(8))): 
    if sh.cell(i, 1).value == sys.argv[1]: 
     hlo.append(sh.cell(i, 8).value) 

我該如何修改這個以便我可以針對一個,兩個或所有這些參數進行測試?因此,如果在一個sh.cell(i,1)中存在group1,則會附加列表,如果存在group1, group2等,附有hlo。

回答

6

您可以遍歷sys.argv[1:],例如通過類似的東西:

for grp in sys.argv[1:]: 
    for i in range(len(sh.col_values(8))): 
    if sh.cell(i, 1).value == grp: 
     hlo.append(sh.cell(i, 8).value) 
+2

你想遍歷'sys.argv [1:]',而不是'sys.argv';你不想包含'argv [0]',這是正在運行的腳本的名字。 – 2009-10-29 14:51:36

2

我會建議看看Python的optparse模塊。這是一個很好的幫手來解析sys.argv

0

我相信這會工作,並會避免循環訪問sys.argv中:

hlo = [] 
for i in range(len(sh.col_values(8))): 
    if sh.cell(i, 1).value in sys.argv[1:]: 
     hlo.append(sh.cell(i, 8).value) 
+0

Thaks,這是非常有用的,更快的解決方案 – jrara 2009-10-30 06:54:31

+0

更改'argv'爲'argv [1:]' - 見Adam對斯蒂芬答案的評論。 – 2009-10-30 10:55:10

3
outputList = [x for x in values if x in sys.argv[1:]] 

替代品是有關你(電子表格?)情況的位。這是一個list comprehension。您也可以調查自2.3版以來已在標準庫中的optparse模塊。

1

argparse是另一個功能強大,易於使用的模塊,爲您解析sys.argv。對於創建命令行腳本非常有用。

0
# First thing is to get a set of your query strings. 
queries = set(argv[1:]) 
# If using optparse or argparse, queries = set(something_else) 
hlo = [] 
for i in range(len(sh.col_values(8))): 
    if sh.cell(i, 1).value in queries: 
     hlo.append(sh.cell(i, 8).value) 

答案===結束質疑===

另外:OP使用xlrd ......這裏有幾個性能的提示。

這個簡單的例子無關緊要,但是如果您要對單元格值進行很多基於座標的訪問,則可以使用Sheet.cell_value(rowx,colx)做更好的改變Sheet.cell(一行x,COLX).value的它建立在運行一個Cell對象的:

queries = set(argv[1:]) 
hlo = [] 
for i in range(len(sh.nrows)): # all columns have the same size 
    if sh.cell_value(i, 1) in queries: 
     hlo.append(sh.cell_value(i, 8)) 

,或者你可以用Sheet.col_values(COLX)方法一起使用列表理解:

hlo = [ 
    v8 
    for v1, v8 in zip(sh.col_values(1), sh.col_values(8)) 
    if v1 in queries 
    ]