嵌套的try语句打开EXCEL表

时间:2012-04-11 00:13:01

标签: python try-catch xlrd

我正在尝试在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

这看起来很笨重......有没有更多的pythonic方式来做这个

3 个答案:

答案 0 :(得分:4)

只是迭代可能性,试图依次打开每一个:

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

运行后,sheet将设置为可以打开的第一个thing。如果无法打开,则sheet将为None

答案 1 :(得分:2)

Excel工作表名称不区分大小写。 Excel不允许您在单个工作簿中创建多个具有(地图,地图,MAP,maP等)名称的工作表。

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使用不区分大小写的搜索。

答案 2 :(得分:1)

虽然它不像其他一些方法那样可读,但可能最简单的方法是使用:

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))