我正在尝试在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方式来做这个
答案 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))