Вложенные операторы 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 использовать поиск без учета регистра.