0

XL でワークシートを開こうとしています。ワークシートには、「Map」、「map」、または「MAP」という名前を付けることができます

これが私がしていることです

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 では、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 で大文字と小文字を区別しない検索を使用するように要求する機能強化リクエストを作成したいと思うでしょう。

于 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 に答える