2012-04-11 10 views
0

XLでワークシートを開こうとしています。ワークシートは、「地図」、「マップ」または「MAP」と命名することができXLシートを開くためにネストされたtryステートメント

これは私がこれはかなり不格好に見える

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 

やっているものです...これを行うにはより多くの神託の方法がありますsheetが最初thingに設定され、これを実行した後

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

答えて

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

複数の名前が機能する可能性もあります。たとえば、MAPとMAPの両方が存在する可能性があります。反復メソッドを使用すると、どの名前が上書きされるかを決めることができます。 '[0]'を使うと、 'set'コードが選んだ順番どおりに選択するだけです。しかし、可能な名前の長いリストであれば、 'set'メソッドは高速になりますが、他の状況に注意しておくとよいでしょう。 :-) – torek

+0

@torek:2〜3の名前のExcelブックでワークブックを作成してみてください。 –

+0

-1完全に上に。私の答えを見てください。 –

4

ただ、各1ターンで開こうとし、可能性を反復しますそれを開くことができます。何も開けない場合は、sheetNoneになります。

+0

+1、私は似たようなものを投稿しようとしていましたが、あなたは私を打ち負かしました。しかし、 'thing'の* none *が(最後の例外を再発生させる場合) - ループの' else'節がこのために完璧であるというケースを、明示的に処理できることは有益でしょう。また、 'except:'(OPのいくつかの似たようなもの)は、名前が間違っていると 'sheet_by_name'が発生するという例外を明示的に述べるべきです。 – lvc

2

Excelシート名では大文字と小文字は区別されません。 Excelでは、1つのワークブックに複数のシート名(マップ、マップ、マップ、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を要求する拡張要求を提起したいとします。

関連する問題