‘A’, …, ‘Z’, ‘AA’, …, ‘AZ’, ‘BA’, …, …, ‘ZZ’

この見出しにピンと来たら。

「毎度整理しないので何度も書くハメになる」シリーズ。

1 from itertools import chain
2 COLNAMES = tuple(
3     chain(*[[c0 + chr(j + 65) for j in range(26)]
4         for c0 in [''] + [chr(i + 65) for i in range(26)]]))
5 print("\n".join(COLNAMES))

あれです。excel の列名からインデクスを引くやつ。こういう用途:

1 sheet.cell(row, COLNAMES.index('AL'))

これね、「python から excel を扱う OSS」が提供してたりもするものなんです。なので、何ゆえに車輪の再発明をするのか、というゾーンではあるの。なのだけれどもね、excel を扱う OSS のメジャーな三品、いずれも一長一短あって、どれか一つだけを使う、という風にはなかなかならない。だから、単に「アタシがズボラで毎度整理しないので」という理由だけでは説明出来ないもんでもあって。「3品」を一応説明しとくと、

  1. PyWin32 の COM/OLE 連携
    • 長:Office がインストールされていれば、VBA から出来ること全てが出来る
    • 短:Windows でしか動かない。
    • 短:excel を起動してしまうため、重いのと作業の邪魔をするのと、等不愉快ネタ満載
  2. pyExcelerator
    • 長:Unix系でも動く/Officeインストール不要
    • 長:速い
    • 短:xlsx 未対応
  3. xlrd, xlwt, xlutils
    • 長:Unix系でも動く/Officeインストール不要
    • 長:速い
    • 長:xlsxまぁまぁ対応
    • 短:xlsxでの非対応部分はガッカリするもの(コメント抽出が、「出来るが出来ない」(どのシートに属するコメントなのかの情報を取れない、等))
    • 短:なんでこんなお馬鹿な分割パッケージなの? (xlutils が xlwt に依存してる。逆でしょうに…。) 分割してる意味なくね?

なわけなんで、残念なことにアタクシ、これら全部を、都度都度ターゲット依存で使い分けています。となると、「カラム名からインデクスを」ごときのことで、「今は pyExcelerator だからぁ」などと考えるのが面倒くさくなってなぁ。

そういうわけで、なんだか毎度書くハメになる、と。

そして、だ。「毎度同じ物になる」わけではないわけで。だって、以前書いたものを、次に書くときには百発百中で忘れとるんだから。

多分ねぇ、辞書でやったこともあると思うし、あと、「計算」でやってたこともあると思う。だって所詮26進数でしょ。あるいはもっとお馬鹿な、「一文字ならばほにゃらら、二文字ならば分割してほにゃらら」な、「所詮26進数」であることを忘れた処理も書いた気がする。まぁこんなもんは、何度書いてもすぐに書けてしまうもんなので、何度忘れても別段人生の損になってるわけではないからな。悔いたりはしない。落ち込んだりもしたけれど、私は元気です。