テキストファイルを逆順でナンバリング

弊社内のHaskell勉強会に参加したので、その時のお題をPythonでも書いてみます。 (元のお題は複数のファイル名を受け付けていますが、ここでは1つだけに変えています)ちなみにitertools.countの増分はPython 2.7からなので、それ以降じゃないと動きません…

物理メモリの使用量

Pythonプログラム自身、どのくらいのメモリを食うのか調べてみます。 import resource ru = resource.getrusage(resource.RUSAGE_SELF) print ru.ru_maxrss 4284 このプログラムをpsコマンドで見るとこんな感じ。 USER PID %CPU %MEM VSZ RSS TTY STAT START…

Wake on LAN

会社のビルが土日停電になった後で、日曜日のうちに踏み台経由で社内ネットに入り自分のマシンを復旧させてリモート仕事したいときに使います...(汗) MACADDR = '01:23:45:67:89:AB' IPADDR = '192.168.111.222' IPPORT = 9 import socket macstr = ''.join(…

エラーログファイル

プログラム実行中に発生したエラーを、error.logファイルに追記していきます。 import logging logging.basicConfig( level=logging.DEBUG, filename='error.log', filemode='a') try: x = 1 / 0 except Exception, exc: logging.exception(exc) raise ERROR…

バッチ化とmap(None, *a)とzip(*a)

バッチ化はgroupbyを使う方法とisliceを使う方法は前に紹介しましたが、こちらの方がシンプルでいいかも(イテレータではないのでパフォーマンスの配慮は必要ですが)。 >>> x = xrange(1, 32) >>> map(None, *([iter(x)] * 7)) [(1, 2, 3, 4, 5, 6, 7), (8,…

迷路を描く

もう裏技かどうか関係ないような気もしてきましたが、乱数で迷路を描いてみることにします。 年賀状のネタにしようかな。迷路って何となくヘビっぽいし... 別冊だったころのマイコンBASICマガジンとか読んで理解した (あー歳がー) 迷路生成法の「壁延ばし法…

位置を指定して文字列を挿入

文字列はimmutableなので、昔は def insert(pos, s, x): return x.join([s[:pos], s[pos:] ]) とかやってましたけど、Python 2.6あたりからbytearrayが入ったので、頻繁にinsert操作するならこちらがお奨めです。 ただ、ちょっと気をつけないといけないのは.…

MACアドレス

MACアドレスを調べたい場合、UUIDの末尾48ビット部分を取るという方法があります。 import uuid print '%012X' % uuid.getnote() 私はWi-Fiフィルタリング指定のためMACアドレスを調べようと思ったのですが、困ったことにノートPCだとこの方法はEthernet (LA…

ctypesを使ってMessageBoxを表示

# -*- coding: cp932 -*- from ctypes import windll messagebox = windll.user32.MessageBoxA messagebox( None, "0で加算しました", "エラーじゃない", 1) messagebox( None, "アプリケーションの実行に必要なメモリを買う財力がありません", "余計なお世…

a or b or c or ...

orの連続は、最初に真になる値を探します。真値が見つかったら残りの式は実行されません。 a or b or c or None これを可変長にしてみようと思います。reduceを使えば対応できそうですが、orの演算関数版がありません(operator.or_は「a | b」ビット演算の…

文字列の複数行表記

継続行を使ったり三重引用符を使えば複数行に渡る文字列を表現できますが、これらはインデントできないのが難点です。インデントすると文字列の中に余計な空白が入ってしまいます。 text = '\ 1行目\n\ 2行目\n\ 3行目' text = '''\ 1行目 2行目 3行目''' こ…

数値に3桁ごとのコンマを入れる

import locale locale.setlocale(locale.LC_NUMERIC, 'ja_JP') locale.setlocale(locale.LC_MONETARY, 'en_US') # 2011年日本の人口 & GDP(USドル) population = 127817277 gdp = 5867200000000 print locale.format('%d', population, True) print locale.c…

GoogleDriveからDropboxへのファイルコピー

Guido氏移籍記念ということで。まずは準備段階から。 Googleから振られた「Client ID」と「Client secret」を確認 GoogleDriveのAPIは、自分のGoogleアカウントにログイン後次のURLでDrive APIをonにすれば有効になる。振られたIDとキーはAPI Accessのページ…

文字の正規化

禁止文字の検出などはWebフォームでよく使いますが、一方ですでにお客さんから受け取ってしまった業務データファイルについては、突っ返すわけにもいきませんので、文字の正規化や統一などの操作を行ってから名寄せや情報の統合を図ったりします。 ## Unicod…

禁止文字の検出

# -*- coding: utf-8 -*- FORBIDDEN_CHARS = set(unichr(c) for c in xrange(0xFF61, 0xFFA0)) s = "入力文字列" if any(c in FORBIDDEN_CHARS for c in unicode(s, 'utf-8')): print "半角カタカナを入れてはいけない" else: print "OK" たぶんこういうのは…

for elseとiterator

forのelse節は、breakしないでループが終了したとき実行されます。 ではイテレータ終了前にStopIterationを発行したとき、elseは実行される? def g(): yield 1 raise StopIteration yield 2 yield 3 for i in g(): print i else: print "finish" 1 finish …

難読化

実用度ほぼ皆無です。まあこういう書き方もできるということで。 (Python3からは使えなくなるらしいですが...) # -*- coding: rot13 -*- cevag h"Uryyb ebg13 jbeyq!"

関数の戻り値をキャッシュする

ある関数について高速化を図るため、キャッシュ用の辞書型に引数-戻り値を保存して返す必要が出てきたとします。 最近では@lru_cacheデコレータがありますが、Python 3.2より前だと標準的なものはないので、自前でデコレータやラップ関数を作ることもありま…

allとany

組み込み関数のall/anyは、and/orを繰り返し行うといった感じです。 # all(iter(x)) x[0] and x[1] and x[2] and ... # any(iter(x)) x[0] or x[1] or x[2] or ... ただし演算子and/orのように左辺や右辺の値を返すのではなく、all/anyはTrue/Falseを返しま…

andとor

よく文法の説明には、andとorの論理演算子はこんな感じに書かれています。 真 and 真 -> 真 真 and 偽 -> 偽 偽 and 真 -> 偽 偽 and 偽 -> 偽 真 or 真 -> 真 真 or 偽 -> 真 偽 or 真 -> 真 偽 or 偽 -> 偽 ただこれは、ブーリアン代数のandとorの説明であ…

AndroidをGPSロガーにする

Python mini Hack-a-thon (http://atnd.org/events/12812) での即興ネタ。 SL4AでGPSの座標情報が取得できる。 Py4AにはGoogleスプレッドシートライブラリが用意されている。 ということで、Googleスプレッドシートに座標情報を保存してみた。以上。 SL4Aで…

AndroidでPythonを書く (2)

SL4A + Py4Aでどういうアプリが書けるか UIFacadeベース (○可能) アプリのメイン部分をPythonで記述 droid.dialog*() を呼び出してUIを構成 WebViewベース (○可能) HTMLでUIを構成し、HTML初期表示とイベント受取後の処理はPythonで記述 HTMLに埋め込んだJav…

AndroidでPythonを書く (1)

Python mini Hack-a-thon 雪山合宿 (http://kokucheese.com/event/index/6029/) でAndroid端末上のPythonをいじったときのメモです。結局アプリ作成は達成できませんでしたが、合宿後も調べたりやったりしたことを追加していくつもり。 SL4A + Py4Aのインス…

イテレータをバッチ化する

[1, 2, 3, 4, 5, 6, 7, 8] ↓ [ [1, 2, 3], [4, 5, 6], [7, 8] ] こんな形にするのを「バッチ化」と言うことがあります。これをイテレータを使って書く方法を考えてみます。 groupbyを使う方法 groupbyを使って、n個ずつグループ化して取り出す方法です。grou…

リストを平坦化する

def flatten(x, isflat=lambda x:not isinstance(x, list)): if isflat(x): yield x else: for item in x: for i in flatten(item, isflat): yield i x = [1,2,[3,4,[5,[6],7],8],9] g = flatten(x) print g.next() print g.next() print g.next() print g.n…

無限defaultdict/辞書型キー初期化

辞書を何階層にも入れ子にして、それでも各階層の初期化を自動的に行いたい場合、setdefaultを使うのであれば d = {} d.setdefault('key1',{}).setdefault('key2',{}).setdefault('key3',{})['key4'] = 'value' print d['key1']['key2']['key3']['key4'] の…

辞書型値の結合

2chスレ「Pythonのお勉強Part33」より。面白かったのでちょっとまとめてみました。 http://pc12.2ch.net/test/read.cgi/tech/1240678081/244- 2つをマージした新しい辞書dict3を一発でつくるにはどうしたらいいですか (...) D1もD2も変更せずに、かつD1とD2…

文字の出現回数を数える/辞書型キー初期化

文字の出現回数といっても、ASCIIの文字だけで、また文字列の中で数えられるくらいならs.count('a')で十分でしょう。 でもサイズの大きいテキストファイルを読み出しながら、漢字などの要素数の多い集合であらかじめ出現するどの文字が出現するかは分からな…

年齢の計算

「今年−誕生年」を計算し、今年の誕生日がまだ来ていなければ1減らす、という方法です。 from datetime import date, timedelta birthday = date(1972, 2, 29) today = date.today() ## y年における誕生日(閏日補正含む) def yearbirthday(b,y): try: retu…

基数変換 - n進数をm進数に変換する

PHPにはbase_convert()という関数があり、2〜36進数文字列どうしの変換ができます。 Pythonは、「int("ABCD",base=16)」として2〜36進数表現からlong値へ変換はできますが、逆にlong値を組み込み関数またはフォーマット文字列を使って2、8、16進数表現にしか…