61 件 見つかりました。
バイナリファイルからデータを読んで、それを16進の文字列で見たいと思った時にどうするか。
以下のようにして見られる。
from binascii import * f = open('del.png', 'rb') print hexlify(f.read(8)) # results: 89504e470d0a1a0aここで見ているのはPNGのシグネチャで、全PNGファイルに共通の構造。
コピーしたファイルとかが、ちゃんとバイナリレベルで一致してるかどうか確かめたい時がある。
直接ビット列を検査するよりも、MD5を比較したほうが多分楽。
pythonでそんな感じのものを書いてみた。とりあえずは動いている感じ。
MD5の一致に加え、比較元と比較先で同じ相対位置に同じファイル名があるかも要チェック。
os.walkのおかげでディレクトリを掘り下げるのが楽だった。
参考:http://morchin.sakura.ne.jp/effective_python/file_system.html
import os, sys, hashlib if len(sys.argv) != 3: print 'invalid arguments' print 'usage: filecomp.py (topdir1) (topdir2)' sys.exit(1) # ensure that topdirs have os.sep-letter at the end. topdir1 = os.path.join(sys.argv[1], '') topdir2 = os.path.join(sys.argv[2], '') i=0 for dirpath, dirnames, filenames in os.walk(topdir1): for fname in filenames: if i > 10: print 'too many mismatches!' sys.exit(1) path1 = os.path.join(dirpath, fname) m1 = hashlib.md5(open(path1, 'rb').read()).hexdigest() path2 = path1.replace(topdir1, topdir2, 1) if os.access(path2, os.F_OK): m2 = hashlib.md5(open(path2, 'rb').read()).hexdigest() else: i+=1 print 'mismatch #%d' % (i) print '%s exists, but\n%s does not exist.\n' % (path1, path2) continue ### check #print m1, path1 #print m2, path2 #os.system('md5sum.exe -b %s' % path1) if m1 != m2: i+=1 print 'mismatch #%d' % (i) print '%s: %s\n%s: %s\n' % (path1, m1, path2, m2) for dirpath, dirnames, filenames in os.walk(topdir2): for fname in filenames: if i > 10: print 'too many mismatches!' sys.exit(1) path2 = os.path.join(dirpath, fname) path1 = path2.replace(topdir2, topdir1, 1) if not os.access(path1, os.F_OK): i+=1 print 'mismatch #%d' % (i) print '%s exists, but\n%s does not exist.\n' % (path2, path1) continue print 'finished'
いい加減な記録。
ファイル名から拡張子を取り除こうとos.path.basenameしてみたが、これはパス名から最も下の階層を抜きとるだけだった。
じゃあどうすりゃいいかなと考えて下記のようにやったら何かうまくいった。
'.'.join(fname.split('.')[:-1])
Python Imaging Libraryというのがある。便利そう。だけど私が欲しく思っている、コメント読み書きの機能はあるのだろうか。
右記ページで言及されていた:http://blog.modp.com/2007/08/python-pil-and-png-metadata-take-2.html 。でもなんか実装もビミョーみたいだし、日本語OKなiTxtのサポートもされていない感じ。画像にコメントって便利だと思うけど、あんま普及はしていないのかな。
python-modeで C-c C-h とすると py-help-at-point が使えると python-mode on emacs 環境向上計画から学んだ。py-help-at-pointとはカーソルのあたりにあるキーワードのヘルプを表示してくれる機能。ただ「sourceforge.net配布のではなぜかうまく動かないのでpythonソース付属のものを使ってます。」とある。実際やってみたらそうだったので手順などをメモ。
「sourceforge配布」とはこちらのもの:http://sourceforge.net/projects/python-mode 。本家より"collection of Emacs packages"として辿れる。
一方で、pythonソースも勿論本家より入手できる。私は2.5.1のものをダウンロードしたがMiscディレクトリの中にあった。11行目の記述は以下の通り。
(defconst py-version "$Revision: 34960 $"これをsite-lispディレクトリとかに放り込めばpython-mode自体のインストールは終わる。
[2007-12-14-1]に、pythonで正規表現HTMLからアンカー(リンク)を抽出する方法をメモした。
我ながら不恰好なスクリプトだなと思っていたが、案の定もっと洗練された方法があった。
import re s = open('hoge.html', 'r').read() reg = re.compile(r'<a href="(\S+?\.pdf)">(.+?)</a>') for r in reg.finditer(s): print 'wget %s' % r.group(1)
pythonスクリプトを使ってやりたい事は大体世界共通なので、他人様のコードが使えると大変に便利。
というわけでサンプルコード集についてメモ。
-ASPN: Python
-Useless Python
-Pythonというプログラミング言語の逆引き(やりたい事から方法を調べる)が出来るwebサイトか本はありますか?日本語では難しいと思うので英語のサイトでも構いません。 質よ.. - 人力検索はてな
あるWeb pageを開いたら、リンクが一杯張られていて、リンク先全てをダウンロードしたい、という状況がある。
そのためには<a href>のリンクアンカーの中身を正規表現を使って拾い上げ、それらをwgetに喰わせるのが一般的な作戦である(と思う)。
pythonでこれを行ったのでメモ。下記は、pdfへのリンクのみを抽出している。
import re fname = "hoge.html" f = open(fname, 'r') str = f.read() regexp = r'<a href="(\S+?\.pdf)">(.+?)</a>' reg = re.compile(regexp) pos = 0 while True: r = reg.search(str, pos) if not r: break print 'wget %s' % r.group(1) # print 'name: %s' % r.group(2) pos = r.end()
ファイル名の先頭に、"014_xxxx" "019_xxxx" ... などと「ファイル番号」をつけておくと、キレイに並べられるなど整理の見通しが良くなるので、個人的に多用する。
例外的に、あるファイル番号を割込ませたいと思う状況がある。001から020までビッシリとファイル番号が振られているという状況で、014から020のファイル番号をインクリメントして015から021とし、新しく持ってきたファイルに014番を割当てる、といった具合である。
そのためのスクリプトを書いたのでメモ。globをreverseしているのは、偶発的なファイル名重複を避けるため。(021_hoge, 022_hogeなるファイルがある時、021_hoge => 022_hoge というrenameは失敗する。022_hoge => 023_hoge なる rename から行えば重複は生じない)
import re import glob, os id_from = 13 reg = re.compile('(\d+)_(.*)') flist = glob.glob('*') flist.reverse() for fname in flist: r = reg.search(fname) if r: id = long(r.group(1)) body = r.group(2) if id >= id_from: os.rename(fname, "%03d_%s" % (id+1, body))
import os for i in range(1,20): f = open('%03d_test' % i, 'w') f.write('dummy %d', i) f.close
ソースを書いている際、だんだんファイル中のコード量が増えてきて見通しが悪くなることがよくある。
emacsのoutline-modeがこんな時に活躍する。さてこれをpythonのソースに適用したい場合はどうすればよいか?
そのものズバリのものが有志により作成済みであった。世の中広い。.emacsにコピペして、pyファイルのバッファで python-outline すればOK。
Python outline mode in emacs