61 件 見つかりました。

CHALOW Search - hiChangeLog ChangeLog INDEX

[ 前へ ] 1 2 3 4 5 6 7 [ 次へ ]

バイナリデータを16進の文字列で表現するにはhexlifyを使う [python]

バイナリファイルからデータを読んで、それを16進の文字列で見たいと思った時にどうするか。
以下のようにして見られる。

from binascii import *
f = open('del.png', 'rb')
print hexlify(f.read(8))
# results: 89504e470d0a1a0a
ここで見ているのはPNGのシグネチャで、全PNGファイルに共通の構造。
http://homepage2.nifty.com/sophia0/png.html

あるディレクトリ以下のファイル群をMD5で比較 [python]

コピーしたファイルとかが、ちゃんとバイナリレベルで一致してるかどうか確かめたい時がある。
直接ビット列を検査するよりも、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'

ファイル名から拡張子を取り除くコード [python]

いい加減な記録。
ファイル名から拡張子を取り除こうとos.path.basenameしてみたが、これはパス名から最も下の階層を抜きとるだけだった。
じゃあどうすりゃいいかなと考えて下記のようにやったら何かうまくいった。

'.'.join(fname.split('.')[:-1])

Python Imaging LibraryでPNGのコメントを扱う [python]

Python Imaging Libraryというのがある。便利そう。だけど私が欲しく思っている、コメント読み書きの機能はあるのだろうか。

右記ページで言及されていた:http://blog.modp.com/2007/08/python-pil-and-png-metadata-take-2.html 。でもなんか実装もビミョーみたいだし、日本語OKなiTxtのサポートもされていない感じ。画像にコメントって便利だと思うけど、あんま普及はしていないのかな。

python-modeのpy-help-at-pointを使う [python][Emacs]

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自体のインストールは終わる。

ただ私の環境(WinXP + Python 2.4.4)では、helpを見るためにはhelp自体のインストールも必要であった。
まず本家の2.4.4ドキュメント配布ページよりHTML形式のものを入手する。
上記配布ページはやや行きにくかった。まずただのドキュメント配布ページに行き、Download Current Documentationlを選択し、左からOlder versionsを選択することでようやく辿り着けた。
上記ドキュメントを展開し、適当な場所に置いた上で、環境変数PYTHONDOCSに C:\Python24\html などと設定する。

以上で C-c C-h が機能するようになったので、正しく設定できたようである。

HTMLからアンカー(リンク)を抽出する (その2) [python][正規表現]

[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プログラミング:14

pythonのサンプルコード集 [python]

pythonスクリプトを使ってやりたい事は大体世界共通なので、他人様のコードが使えると大変に便利。
というわけでサンプルコード集についてメモ。

-ASPN: Python
-Useless Python
-Pythonというプログラミング言語の逆引き(やりたい事から方法を調べる)が出来るwebサイトか本はありますか?日本語では難しいと思うので英語のサイトでも構いません。 質よ.. - 人力検索はてな

HTMLからアンカー(リンク)を抽出する [python][正規表現]

ある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()

もっと洗練された方法があるかもしれないが、動いたのでまあいいや。

Referrer (Inside): [2007-12-21-1]

「ファイル番号」をインクリメントするスクリプト [python]

ファイル名の先頭に、"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

pythonでoutline-mode [python][emacs]

ソースを書いている際、だんだんファイル中のコード量が増えてきて見通しが悪くなることがよくある。
emacsのoutline-modeがこんな時に活躍する。さてこれをpythonのソースに適用したい場合はどうすればよいか?

そのものズバリのものが有志により作成済みであった。世の中広い。.emacsにコピペして、pyファイルのバッファで python-outline すればOK。
Python outline mode in emacs

[ 前へ ] 1 2 3 4 5 6 7 [ 次へ ]

ChangeLog INDEX
Powered by chalow