Как проверить несколько аргументов командной строки (sys.argv - PullRequest
4 голосов
/ 29 октября 2009

Я хочу проверить повторы нескольких аргументов командной строки в цикле

> 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) есть группа 1, список добавляется, а если есть группа 1, группа 2 и т. Д., То добавляется hlo.

Ответы [ 6 ]

6 голосов
/ 29 октября 2009

Вы можете перебрать 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)
3 голосов
/ 29 октября 2009
outputList = [x for x in values if x in sys.argv[1:]]

Замените биты, которые имеют отношение к вашей (электронной таблице?) Ситуации. Это список понимания . Вы также можете исследовать модуль optparse , который находится в стандартной библиотеке с 2.3.

2 голосов
/ 29 октября 2009

Я бы рекомендовал взглянуть на модуль Python optparse . Это хороший помощник для разбора sys.argv.

1 голос
/ 29 октября 2009

argparse - еще один мощный и простой в использовании модуль, который анализирует sys.argv. Очень полезно для создания сценариев командной строки.

0 голосов
/ 30 октября 2009
# 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, который строит объект 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
    ]
0 голосов
/ 29 октября 2009

Я полагаю, что это сработает и позволит избежать итерации по 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...