Вложенные операторы try для открытия листа XL

Я пытаюсь открыть рабочий лист в XL. Рабочий лист может быть назван "Карта", "Карта" или "Карта"

Это то что я делаю

import xlrd
book = xlrd.open_workbook(xls) // where xls is the name of the spreadsheet
try:
     sheet = book.sheet_by_name('map')
except:
     try:
        sheet = book.sheet_by_name('Map')
     except:
        try:
          sheet = book.sheet_by_name('MAP')
        except:
           raise

Это выглядит довольно неуклюже... Есть ли более питонический способ сделать это

3 ответа

Решение

Хотя он не так удобен для чтения, как некоторые другие методы, возможно, самый короткий путь - это использовать:

sheet = book.sheet_by_name(list(set(['map', 'Map', 'MAP']) & set(book.sheet_names())[0])

По сути, здесь используется концепция пересечения списков, представленная в другом ответе SO. Вероятно, более простой способ создать это, чтобы легче было читать:

possibleNames = ['map', 'Map', 'MAP']
sheetNames = book.sheet_names()
name = intersect(possibleNames, sheetNames)
if len(name) < 1:
    print "Error"
    # break program appropiately
sheet = book.sheet_by_name(name[0])

def intersect(a, b):
    return list(set(a) & set(b))

Просто переберите возможности, пытаясь открыть каждый из них по очереди:

sheet = None
for thing in ['map','Map','MAP']:
  try:
    sheet = book.sheet_by_name(thing)
    break
  except:
    pass

После этого запускается, sheet будет установлен первым thing это может быть открыто. Если ни один не может быть открыт, то sheet будет None,

Имена листов Excel не чувствительны к регистру. Excel не позволит вам создать более одного листа с именем в (карта, карта, карта, карта и т. Д.) В одной книге.

candidates = [n for n in book.sheet_names() if n.lower() == 'map']
assert len(candidates) in (0, 1)
if candidates:
     sheet = book.sheet_by_name(candidates[0])
else: 
     whatever()

Возможно, вы захотите поднять запрос на расширение, запрашивающий для Book.sheet_by_name использовать поиск без учета регистра.

Другие вопросы по тегам