如何testing多个命令行参数(sys.argv

我想在循环中重新testing多个命令行参数

> python Read_xls_files.py group1 group2 group3 

没有这个代码只testing第一个(group1)。

 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) 

我应该如何修改这一点,以便我可以对这些论据中的一个,两个或全部进行testing? 所以,如果在一个sh.cell(i,1)中有group1,则附加列表,如果有group1,group2等,则附加hlo。

你可以遍历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) 
 outputList = [x for x in values if x in sys.argv[1:]] 

replace与您的(电子表格?)情况相关的位。 这是一个列表理解 。 您也可以调查从2.3开始已经在标准库中的optparse模块。

我build议看看Python的optparse模块。 这是parsingsys.argv的好帮手。

argparse是另一个function强大,易于使用的模块,为您parsingsys.argv。 对于创build命令行脚本非常有用。

我相信这将工作,并会避免迭代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) 
 # 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 (rowx,colx).value即时build立一个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 ]