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 はメールボックスと呼んでいる。メールボックス…

^Z の意味

C

マイクロソフトの「Cランタイム・ライブラリ」に \x1D を読み込ませると、そこで入力が止まってしまうという話を少し前にした。古い本「C言語を256倍使うための本」を読んでいたらその理由が書いてあった。だが^Zは, ファイルサイズをクラスタ単位でしか管理…

.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() # …

WriteFileでWCHARを書き込む方法とか

C

ワイド文字列を WriteFile() でファイルに書き出してみる。 #define UNICODE #include <windows.h> #include <stdio.h> void test(HANDLE file) { WCHAR s[] = L"あいうえお"; DWORD written; WriteFile(file, s, 5 * sizeof(WCHAR), &written, NULL); } int main() { HANDLE fil</stdio.h></windows.h>…

コーデック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…

スーパーpre記法がおかしい件について

このブログの過去の記事を見るとわかるが、スーパーpre記法で記述したものがおかしなことになっている。例えば、コードが途切れていたり: 色分けが無効になっていたりする: http://i.hatena.ne.jp/idea/22423 を見ると、12日に報告がなされ、16日に「修正…

メールのタイトルを取得

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…