Python

time.tznameが文字化けしてるんだが

time.tzname の値がおかしい。 # Python 3.4.3 on Win32 import sys import time print(time.tzname[0], file=sys.stderr) # ==> \x93\x8c\x8b\x9e (\x95W\x8f\x80\x8e\x9e) 化けてますねー (わざわざ sys.stderr に出力したのは、例外で落ちないようにする…

warnで警告を表示させる

warnings.warn を使うと警告文を表示させることができる。 import warnings warnings.warn('警告です') print('hello world') # プログラムは続行 実行するとstderrに警告文が表示されるものの、プログラムは停止せず、そのまま実行を継続する。 C:\temp\scr…

tkinterでは基本多言語面しか使えない

Python の tkinter.Entry に入力した内容を取り出そうとすると、こういう例外が出る文字がある。 UnicodeDecodeError: 'utf-8' codec can't decode byte 0xed in position 0: invalid continuation byte 何とか迂回できないものかと、対話モードで色々弄って…

time.strftime で UnicodeEncodeError が出るんだが

WindowsのPython3で、time.strftimeに日本語を渡すと例外が出る。 >>> import time >>> time.strftime("%Y年%m月%d日") Traceback (most recent call last): File "<stdin>", line 1, in <module> UnicodeEncodeError: 'locale' codec can't encode character '\u5e74' in p</module></stdin>…

誰がthreadingで作ったスレッドの後始末をしているのか

メインスレッドが終了すると、_threadモジュールで作ったスレッドは終了してしまう。 #! python3.3 import _thread import time def func(): ident = _thread.get_ident() print('thread {} starts'.format(ident)) time.sleep(5) print('thread {} ends'.fo…

winregでREG_QWORDを無理やり読み書きする方法

今のところPythonのwinregはREG_QWORDに対応していない。しかしwinregのソースを見てみたところ、未知のデータ型はバイナリ扱いにするようなので、整数をバイナリに変換すれば読み書きできることに気がついた。具体的にはwinreg.SetValueEx()を呼ぶ前にデー…

新12桁トリップなど

いつの間にかトリップコードの仕様が新しくなっていた。例のごとく情報が散逸していて仕様を調べるのに苦労したが、この記事が大いに参考になった。まず12桁トリップから行こう。こちらは結構簡単で、キーをSHA1でみじん切りにしたあと、Base64で見た目を整…

IMAP4と日本語のメールボックス

少し前に Yahoo!メールが IMAP4 から読めるようになったので、Python の標準ライブラリに収録されている imaplib を試しているが日本語で問題が発生した。普通のメールソフトでフォルダに相当するものを IMAP4 はメールボックスと呼んでいる。メールボックス…

.pycファイルを作成させない方法メモ

Python に Bオプションを付けるか、環境変数 PYTHONDONTWRITEBYTECODE を作ると .pycファイルが作成されなくなる。具体的には python -B foo.py のように実行するか、 :: Windows cmd の場合 set PYTHONDONTWRITEBYTECODE=1 foo.py # Linux bash の場合 expo…

collections.Counterの使用例

だいぶ前に defaultdict について書いたけど、出現回数のカウントは collections.Counter クラスの方がシンプルに書ける。 # Python 3.2.2 from collections import Counter c = Counter('abrakadabra') for k, v in c.items(): print(k, '----', v) # 結果:…

winregのREG_DWORDの扱いがちょっと

Python にはレジストリを扱うために winreg というライブラリがついてくるけれど、REG_DWORD の扱いに少し問題があることがわかった。 問題1:大きな整数が正しく読み込めない 例えば 4294967173 という大きな数を読もうとすると、-123 になってしまう。 # …

"\x1a" で入力が止まってしまう

Windowsで "\x1a" を含むテキストファイルをCPythonに読ませると、途中で読み込みが停止してしまうようだね。 # CPython 2.7.2 on Win32 with open('a.txt', 'wb') as fout: fout.write("abc\x1adef") with open('a.txt', 'r') as fin: print fin.read() # …

コーデックmbcsでは例外が発生しない

_winreg の件を調べていて気付いたんだけど、コーデック mbcs は変換できない文字に出会っても例外を発生させないね。 # Python 2.7.1 # ↓ハングルと簡体字が含まれてます data = u'\ud55c\uae00 and \u7b80\u4f53\u5b57' print data.encode('mbcs') # 出力…

Python2.7の_winregでは読めない文字がある

_winreg にある関数に REG_SZ 値を取得させると、 unicode を返すようになっている。でも、内部では ANSI 版の Widnows API を使っているので、cp932(≒Shift_JIS)に含まれない文字が化ける。例えば、韓国語のハングルや、中国語の簡体字を日本語版の Windo…

.pycファイルを作成する方法メモ

時々しかやらないから方法をいつも忘れるな。モジュール compileall か py_compile を使うと .pyファイルをコンパイルして .pycファイルを作成できる。これらのモジュールは直接実行できるようになっているので、例えば foo.py をコンパイルするにはこうする…

明後日の場所でUnicodeDecodeError

Google App Engine の webapp フレームワークを使ってコードを書く。↓これは大丈夫だが、 class Page1(webapp.RequestHandler): def get(self): self.response.headers['Content-Type'] = 'text/plain' self.response.out.write('abc') self.response.out.wr…

数字をコンマで区切る

いつの間にか数字をコンマで区切る方法がやけに簡単になってるな。 # Python 3.1 print("{:,d}".format(1234567890)) # 1,234,567,890 さらに書式指定を n にすると、ロケールに合わせた桁数と文字で区切ってくれる。例えばドイツでは3桁ごとに . で区切っ…

unicodeのraw文字列は \ をエスケープしない場合がある

Vistaに変えたので、ハードコードされたパスを置き換えていたところ、以下のようなコードでエラーになることに気付いた。 path = ur'C:\Users\foo\Documents' 例外はこんな感じ。文法エラーがあると言っている。 SyntaxError: (unicode error) 'rawunicodees…

ブラウザのクッキー欲しい!

IE と Firefox の場合について。 Firefox Firefox の場合、クッキーはプロファイルフォルダの cookies.sqlite に保存される。プロファイルフォルダの探し方は Firefox のサポートページに書いてある。SQLite は アプリケーションに組み込まれて利用される軽…

数字を桁区切りにする

大きな数字を読みやすくするために区切って表示するにはどうしたらいいか?それはチュートリアルにちゃんと書いてある。基本的にはこうか、 # Python 3.0 import locale n = 1234567890 locale.setlocale(locale.LC_ALL, "") s = locale.format("%d", n, gro…

七色に輝くListbox

tkinter.Listboxクラスにはitemconfigureなるメソッドがある。 これを使うと、項目の色を個別に設定できるんすね。 ニューメキシコ大学のサーバーにあるリファレンスにも載ってないから初めて知った。 # Python 3.0 import tkinter root = tkinter.Tk() labe…

メールのタイトルを取得

poplibで取得したメールヘッダからタイトルだけを抜き出して列挙したかったのだが、emailパッケージの使い方がよくわからん。 リファレンスと格闘して何とか取れるようになったのだが、これでいいのだろうか。 # Python 2.6 import poplib from email.parser…

timeには関数が多すぎる

timeライブラリには色々な関数があるが、関係がよくわからんので、図にまとめてみたが、分かりやすくなってなのは気にしないでくれ。 「float」は1970年1月1日が開始してからの秒数。 「tuple」は (年, 月, 日, 時, 分, 秒, 曜日, 年日, 夏時間フラグ) とい…

伸びる画面

こんな画面を作ろうと思った:右側だけ伸び縮みするのだよ:コードはこんな感じなのだよ: import wx class MainPenel(wx.Panel): def __init__(self, parent, idn, *args, **kw): wx.Panel.__init__(self, parent, idn, *args, **kw) stext1 = wx.StaticTex…

ElementTree の思い出

昔、訳あってElementTreeのソースコードを電車の中で読んでいたら、となりの人に、これは何かと尋ねられたことを思い出した。その後、プログラムとは何か、ソースとは何かを説明することになるのだが、まぁ、どうでもいいか。 要素の後に来るテキスト <p>hello<span>w</span></p>…

defaultdict を使うのだ

collections.defaultdictを使うと要素のカウントがシンプルに書けるね。 # Python 2.5 from collections import defaultdict d = defaultdict(int) s = "abrakadabra" # 文字別にカウント for i in s: d[i] += 1 # 結果表示 for k, v in d.iteritems(): prin…

urllib.unquoteとunicode

urllib.unquoteはURLエンコードされた文字列を元に戻す関数だ。よくURLで使われている「%E6%97%A5%E6%9C%AC%E8%AA%9E」みたいな文字を元に戻す時に使う。 # Python 2.5.2 on win32 >>> a = urllib.unquote('%E6%97%A5%E6%9C%AC%E8%AA%9E') >>> print a.decod…

バッテリーの状況

Windows でバッテリーの状況は Win32API の関数を使うと取れる。しかし pywin32 *1 には肝心の GetSystemPowerStatus 関数 *2 がないじゃないか。しょうがないので伝家の宝刀 ctypes *3 を使うべ。GetSystemPowerStatus 関数自体はそう難しくない。所定の構…

寝たら翌日とす

datetime は便利だなぁ。 例えば朝5時までは前日と見なす処理: import datetime now = datetime.datetime.now() if now.hour < 5: now = now - datetime.timedelta(hours=5) print "感覚的に言えば今は%d月%d日です。" % (now.month, now.day) 時間が5よ…

デコレータの引数

デコレータは引数を取ることができると Python 2.4 の What's new に書いてあった。 http://www.python.org/doc/2.4/whatsnew/node6.html Decorator functions can take arguments. If arguments are supplied, your decorator function is called with only…