0

我正在尝试在 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的方式来做到这一点

4

3 回答 3

4

只需遍历可能性,尝试依次打开每个可能性:

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

运行后,sheet将设置为thing可以打开的第一个。如果没有一个可以打开,那么sheet将是None

于 2012-04-11T00:18:09.877 回答
2

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

于 2012-04-11T23:39:03.413 回答
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))
于 2012-04-11T00:48:18.157 回答