2007-01-01から1年間の記事一覧

今月の末日を求める

ライブラリリファレンスには載っていませんが、calendarモジュールに「mdays」という各月の日数を並べたリストがあります。せっかくdatetimeモジュールを使っているのに[0, 31, 28, 31, 30, ...]なんてリストを自前で作るのはシャクに障るのでこれを使ってみ…

カレンダーを作る

calendarモジュールを使います。 calendar.calendarやcalendar.monthはテキストで整形して出力します。 import calendar print calendar.month(2008, 1) January 2008 Mo Tu We Th Fr Sa Su 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24…

曜日を調べる

datetime型/date型ともweekday()、isoweekday()メソッドで曜日を取り出せます。 weekday()は月曜0〜日曜6、isoweekday()は月曜1〜日曜7です。 from datetime import date print date(2007,11,30).weekday() print date(2007,11,30).isoweekday() 4 5 おまけ…

Ctrl-Cで中断できないようにする

次のようにすることで、Pythonスクリプトの実行中はCtrl-Cを受け付けないようにできます。 import signal import time ## SIGINTシグナルを無視 signal.signal(signal.SIGINT, signal.SIG_IGN) ## 15秒間待ち続ける(Ctrl-Cで止められない) time.sleep(15) …

ランキングで何位になるか調べる

たとえばゲームの得点ランキングがあり、あるプレイヤの得点が何位になるか調べたい場合があります。 bisectモジュールを使えば、ある値が得点リストの何番目に入るのか調べることができます。 from bisect import bisect ranking = [116, 151, 98] ranking.…

得点のランク分けをする

たとえば、ある学科の成績を「落」「及」「良」「優」に分けるとします。 x = 70 if x このようにひたすらif文を並べる方法もありますが、 from bisect import bisect borderline = [45, 65, 85] grade = ['落', '及', '良', '優'] x = 70 print grade[bisec…

正規表現を使わない文字列比較・置換 まとめ

Rubyなどの言語が構文として正規表現を扱えるためか、しばしばPythonの正規表現は扱いにくいと言われることがあります。しかし逆にPythonを使っている側からすれば、他の言語では必要のないケースで正規表現を使い過ぎるようにも見えます。 次のようなパター…

ノートPCのバッテリー残量を調べる

Windowsの場合 ctypesモジュールを使って電源関係のWin32 APIを直接呼び出します。 Cでラッパー関数を作って呼び出す方法もありますが、こっちのほうがCコンパイラが必要ないので楽に書けます。 Python2.5よりも前のバージョンでは、ctypesモジュールをhttp:…

tar / tar.gz / tar.bz2ファイルを読み書きする

tarファイルの読み書きはtarfileモジュールを使います。 gzipやbzip2で圧縮されている場合でも自動的に判断して読み出すことができます。 import tarfile from datetime import datetime ## tar/tar.gz/tar.bz2ファイルを読む tf = tarfile.open('file.tgz',…

ロードアベレージ/CPU負荷を調べる

UNIXの場合 os.getloadavg()を使います。 import os while 1: time.sleep(1) print '(%6.2f, %6.2f, %6.2f)' % os.getloadavg() float数値3つのタプルを返し、それぞれ直前1分間、5分間、15分間の負荷平均を示します。 ( 0.15, 0.14, 0.10) Windowsの場合 WM…

クッキーを保存・送信しながらWebアクセスする

urllib2とcookielibを使います。 クッキーファイルの読み書きはcookiejar.load()、cookiejar.save()で明示的に行います。 from cookielib import LWPCookieJar from urllib2 import HTTPCookieProcessor from urllib2 import HTTPHandler cookiejar = LWPCoo…

urllib.URLopenerのエラーを詳しく検出する

タイムアウトの設定についてはPython 2.6以降urllib.urlopenerのオプション引数でサポートされるようになりました。後ほど書き直します。 urllib.URLopenerはすべてのエラーをIOErrorで返します。except文はひとつで済むのですが、DNSのエラー、タイムアウト…

ディスクの空き容量を調べる

Windowsの場合 (まだ編集中です) Unixの場合 os.statvfs()を使います。 import os path = '/' st = os.statvfs(path) ## st.f_bsize ... ファイルI/Oリクエストで使われるブロックのバイト数 ## st.f_frsize ... 以下の「ブロック数」で使われるブロックのバ…

三項演算子

Python2.5から使えます。他言語の人が見ると違和感があるかもしれませんが、Perlの後置ifのような書き方になります。 ## CやPerlの「a ? b : c」と同じ x = b if a else c 「普段はbだけど、もしaが成立しなければc」という覚え方をすればいいかもしれません…

デバッガを起動する

Pythonスクリプトを次のように実行すれば最初からデバッガが起動した状態になります。 $ python -m pdb test1.py ソースコードの特定の場所でデバッガに移行して検証したい場合、次の1行を書いておきます。 import pdb; pdb.set_trace() デバッガコマンドに…

プリンタにテキストを出力する

# -*- coding: cp932 -*- import win32ui import win32print import win32con text = 'テスト文字列' hdc = win32ui.CreateDC() printer = win32print.GetDefaultPrinter() hdc.CreatePrinterDC(printer) hdc.StartDoc("test document") hdc.StartPage() hdc…

16進文字列をバイト文字列に/バイト文字列を16進文字列にする

「'%02x'%x」とか「int(x,16)」とかを使って自前関数で頑張るよりも、hexコーデックを使う方が便利です。 # -*- coding: cp932 -*- ## hex → cp932 print '8e8482cc96bc914f82cd8b67936382c582b7'.decode('hex') ## cp932 → hex print 'バイト文字列'.encode…

リストの要素をランダムに並べ替える

random.shuffleを使えばリストの内容を直接ランダムに並べ替えることができます。 from random import Random r = Random() items = range(10) r.shuffle(items) print items

抽選でn個選ぶ

リストから重複がないようにn個選び出したい場合、random.sampleを使います。 ここでは1億人の中から12人(の番号)を選んでいます。 from random import Random r = Random() x = r.sample(xrange(100000000), 12) print x さすがに1億個の要素を持つリスト…

サイコロを作る

from random import Random r = Random() ## A案:1から6までの間の整数を返す x = r.randint(1, 6) ## ※randrangeを使う場合 ## x = r.randrange(1, 7) ## B案:リストの中から1つ選んで返す face = [1, 2, 3, 4, 5, 6] x = r.choice(face)

プロセスを起動して標準入出力でデータをやり取りする

from subprocess import Popen, PIPE p = Popen([cmd,arg1,...], stdin=PIPE, stdout=PIPE) p.stdin.write(snd) rcv = p.stdout.read()

組み合わせを列挙するイテレータ

Python 2.6以降はitertools.combinationsで同様のことができます。以下の記述はPython 2.3〜2.5向けです。 リストからn個取り出したものを返していく。 def gen_comb(L,n): if n == 0: yield [] else: for i,x in enumerate(L): for L1 in gen_comb(L[i+1:],…

素数を列挙するイテレータ

単純に2から割り算を繰り返すものでもいいのですが、そこそこ効率がいいものにするため、最初にエラトステネスの篩をかけるバージョンを作ってみます。まず2、3、5の倍数を削除した数列を1周期分(0〜29)だけ作成します。あとは周期30(=2×3×5)を加算しな…