Помощь с Excel, Python и XLRD

#python #excel #xlrd

#python #excel #xlrd

Вопрос:

Относительно новичок в программировании, поэтому я решил использовать Python для обучения.

На данный момент я пытаюсь прочитать список имен пользователей, паролей из электронной таблицы Excel с помощью XLRD и использовать их для входа во что-либо. Затем вернитесь назад и перейдите к следующей строке. Войдите в систему etc и продолжайте.

Вот фрагмент кода:

 import xlrd
wb = xlrd.open_workbook('test_spreadsheet.xls')

# Load XLRD Excel Reader

sheetname = wb.sheet_names() #Read for XCL Sheet names
sh1 = wb.sheet_by_index(0) #Login

def readRows():
        for rownum in range(sh1.nrows):
                rows = sh1.row_values(rownum)
                userNm = rows[4]
                Password = rows[5]
                supID = rows[6]
                print userNm, Password, supID

print readRows()
  

Я извлек переменные, и программа считывает их все за один раз, вот тут-то и вступает в игру мое отсутствие навыков программирования. Я знаю, что мне нужно перебрать их и что-то с ними сделать, но я немного запутался в том, что является наилучшей практикой. Любая информация была бы отличной.

Еще раз спасибо

Комментарии:

1. «считывает их все за один раз», что значит???

2. Извините, он печатает все значения в столбцах 4, 5 и 6 одновременно. Если бы я вводил процедуры входа вместо их печати, как мне вернуться назад и перейти к следующей строке и прочитать следующий набор значений для входа? и т.д.

Ответ №1:

пара указателей:

я бы посоветовал вам не печатать вашу функцию без возвращаемого значения, вместо этого просто вызовите ее или верните что-нибудь для печати.

 def readRows():
    for rownum in range(sh1.nrows):
        rows = sh1.row_values(rownum)
        userNm = rows[4]
        Password = rows[5]
        supID = rows[6]
        print userNm, Password, supID

readRows()
  

или, взглянув на docs , вы можете взять фрагмент из row_values:

row_values(rowx, start_colx=0, end_colx =Нет) [#]

 Returns a slice of the values of the cells in the given row.
  

потому что вам просто нужны строки с индексом 4-6:

 def readRows():
    # using list comprehension
    return [ sh1.row_values(idx, 4, 6) for idx in range(sh1.nrows) ]

print readRows()
  

используя второй метод, вы получаете возвращаемое значение list из вашей функции, вы можете использовать эту функцию для установки переменной со всеми вашими данными, которые вы считываете из файла Excel. На самом деле список представляет собой список списков, содержащих ваши значения строк.

 L1 = readRows()
for row in L1:
    print row[0], row[1], row[2]
  

После того, как у вас будут ваши данные, вы сможете манипулировать ими, выполняя итерации по списку, аналогично приведенному выше примеру печати.

 def login(name, password, id):
    # do stuff with name password and id passed into method
    ...

for row in L1:
    login(row)
  

возможно, вы также захотите изучить различные структуры данных для хранения ваших данных. Если вам нужно найти пользователя по имени, вероятно, лучше всего использовать словарь:

 def readRows():
    rows = [ sh1.row_values(idx, 4, 6) for idx in range(sh1.nrows) ]
    # using list comprehension
    return dict([ [row[4], (row[5], row[6])] for row in rows ])

D1 = readRows()
print D['Bob']
('sdfadfadf',23)

import pprint

pprint.pprint(D1)
{'Bob': ('sdafdfadf',23),
 'Cat': ('asdfa',24),
 'Dog': ('fadfasdf',24)}
  

следует отметить, что значения словаря, возвращаемые в произвольном порядке в python.

Комментарии:

1. Спасибо за потрясающий ответ. Мне было любопытно узнать об использовании словарей для этой конкретной проблемы. Одна вещь: когда я использую второй пример, я получаю ошибку NameError, что rownum не определен — мне все еще нужен цикл for?

Ответ №2:

Я не уверен, собираетесь ли вы использовать xlrd, но вы можете захотеть ознакомиться с PyWorkbooks (обратите внимание, я автор PyWorkbooks : D)

 from PyWorkbooks.ExWorkbook import ExWorkbook

B = ExWorkbook()
B.change_sheet(0)
# Note:  it might be B[:1000, 3:6].  I can't remember if xlrd uses pythonic addressing (0 is first row)
data = B[:1000,4:7]  # gets a generator, the '1000' is arbitrarily large.

def readRows()
   while True:
       try:
           userNm, Password, supID = data.next()  # you could also do data[0]
           print userNm, Password, supID
           if usrNm == None: break  # when there is no more data it stops
       except IndexError:
           print 'list too long'
readRows()
  

Вы обнаружите, что это значительно быстрее (и, я надеюсь, проще), чем все, что вы бы сделали. Ваш метод получит целую строку, которая может состоять из тысячи элементов. Я написал это, чтобы извлекать данные как можно быстрее (и включил поддержку таких вещей, как numpy).

В вашем случае скорость, вероятно, не так важна. Но в будущем это может быть:D

Проверьте это. Документация доступна вместе с программой для начинающих пользователей. http://sourceforge.net/projects/pyworkbooks

Комментарии:

1. Берг, я определенно собираюсь это проверить. Искал что-нибудь, что можно использовать вместо xlrd. Спасибо.

Ответ №3:

Кажется, это хорошо. С одним замечанием: вам следует заменить «строки» на «ячейки», потому что вы фактически считываете значения из ячеек в каждой отдельной строке