壁紙検索などしてみた

最近モニタを24''WUXGAに変えました。
ちょーでかいです。

とりあえず壁紙を変えようということでWUXGAの壁紙を我が10万オーバーの画像ファイル群から・・・
探せるか!


ということで、Pythonで書いてみました。

やりたいこと

特定のフォルダ以下に存在する画像ファイルのうち、WUXGAサイズ(1920*1200)のもののみをリストアップする
一覧HTMLとかにできると幸せ

コード

import Image
import os, re
from time import sleep

wuxga = (1920, 1200)
flist = open("d:\wuxgalist.html", "w")

try:
    for (root, dirs, files) in os.walk(u'd:\\nijiura'):
        for f in files:
            filepath = root + u"\\" + f
            filename = filepath.replace(u"\\", u"/")
            if re.match(u".*/thumb/.*", filename) or re.match(u'\\.htm', filename):
                continue
            try:
                img = Image.open(filepath)
                print img.size, filename
                if img.size == wuxga:
                    tag = "<a href=\"file:///" + filename + "\"/><img src=\"file:///" + filename + "\" width=\"192\" height=\"120\"/></a><br />" + filename + "<br />"
                    flist.write(tag.encode('utf_8'))
                    print u"!!!!発見!!!!", filename
                    sleep(1)
            except IOError:
                print "I/O ERROR in", filename

finally:
    flist.close()

解説

os.walk()でフォルダ以下のファイルリストを取得できます。
参考:http://www.nishiohirokazu.org/blog/2006/03/python.html

得られたパス名をつなげてフルパスにして、htmlに書き出す用に\を/に置き換えたフルパスも作っておく。
あとはImageに読ませて、サイズを比較して一致したらファイルに書き出す。

マッチしたらcontinueしてる部分は、検索しても無意味なサムネイルフォルダとそもそも画像じゃないhtmファイルを避けるためのものです。
あとPILでインターレースPNGを開こうとするとIOErrorを返されるので例外処理は結構重要。

結果

40KBほどのHTMLファイルができました。
どれだけかかったかは計測しませんでしたが、結構長いことかかってると思います。

誤算

重くてとても開ききれません。
そりゃWUXGAサイズの画像を140枚も表示してりゃそうなりますね。
改善するとしたら適量溜まったら別ファイルに変えるとかそのぐらいかなぁ…

ということで

また書いてみた
参考:ファイル操作 - ひきメモ

flist = open("d:\wuxgalist.html", "r")

try:
    lines = flist.readlines()
    for i in range(0, len(lines), 20):
        split_file = open("d:\wuxgalist_%d-%d.html" % (i,i+20), "w")
        split_file.writelines(lines[i:i+20])
        split_file.close()
        
finally:
    flist.close()

簡易説明

0〜行数の範囲で20とびの数字でループする
ループ変数の値からファイルを作る
20行分を書き込む

最終的に

こんなかんじのHTMLを吐けました。

スクリプト言語すばらしい

今回初めてスクリプト言語スクリプト言語らしく使った気がします。
すばらしいので今後もどんどん書くことにします。