2009-10-29 71 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 
    ]