2014/06/02

【Python】クリークモジュールについて

連番画像+関連ファイル
…みたいな感じで、
フォルダに数種類のファイルが置かれていて、
かつそれぞれに命名規則がある…

といったときに役に立ちそうなモジュールを見つけたので、
調べてみました。

clique (派閥) モジュールっていうやつです。


(※ちなみに「ドン」の方のクリークは、小川とか入り江とかのクリークですね
 スペルは CREEK です!

Cliqueモジュールのドキュメント
http://clique.readthedocs.org

Python Package Indexに入っておられます。
https://pypi.python.org/pypi/Clique

…さて。
とりあえず、チュートリアルにあるようなファイルが入ったフォルダを作ってみました。
実にファ●ッキンごちゃごちゃですが、
現実にはもっとごちゃごちゃにもなりうると思います。合掌。
…ともあれ、
まずはファイル名のリストを取ります。
こういう感じ。

items = os.listdir('/path/to/folder')
これを、
assembleメソッドを使って、ファイル群の派閥に分けます。
collections, remainder = clique.assemble(items)
この例だと、連番などでくくれるものが「collections」に、
孤立しているファイルが「remainder」に入ります。
後者は単なるファイル名のリストですが、
前者は「Collection」クラスとして返ってきています。
今回、 .jpgのファイルは0001と0002だけで、切れ目がありませんが、
.dpxのファイルは0001, 0002, 0010と切れ目があります。

ここで、Collectionクラスの「is_contiguous」メソッドを使うと
jpg = collections[2]
jpg.is_contiguous()
True

dpx = collections[1]
dpx.is_contiguous()
False
連番がつながっているかどうかを返してくれます。

for文で回すと、
for i in jpg:
    print i
file.0001.jpg
file.0002.jpg
そのコレクションの中身を返してくれます。

そのほか、下記のようなのがあります
# プリフィクス
jpg.head
'file.'

# 拡張子
dpx.tail
'.dpx'

# パディングの桁数
jpg.padding
4

# かけてる部分のコレクション
dpx.holes()
<Collection "file.%04d.dpx [3-9]">

# 連番のセット
dpx.indexes
<SortedSet "[1, 2, 10]">


# パターンが一致しているかどうか
jpg.is_compatible(dpx)
False

print jpg.match('file.0100.dpx')
None
print jpg.match('file.0100.jpg')
<_sre.SRE_Match object at 0x10e927a48>

途切れているコレクションの場合、分割できます。

subDpx = dpx.separate()
print subDpx
[<Collection "file.%04d.dpx [1-2]">, <Collection "file.%04d.dpx [10]">]
くっつけるときは、merge。
subDpx[0].merge(subDpx[1])
print subDpx[0]
file.%04d.dpx [1-2, 10]

要素の抜き差し
jpg.add('file.0005.jpg')
print jpg
file.%04d.jpg [1-2, 5]

jpg.indexes.update([3,4])
print jpg
file.%04d.jpg [1-5]

jpg.remove('file.0003.jpg')
print jpg
file.%04d.jpg [1-2, 4-5]

jpg.indexes.discard(2)
print jpg
file.%04d.jpg [1, 4-5]

コレクションを自分で作るには、下記のように。
collection = clique.Collection(head='file.', tail='.jpg', padding=4)
print collection
file.%04d.jpg []

# 別の例
collection = clique.Collection('file.', '.jpg', 4, indexes=set([1, 2]))

もしくは、
collection = clique.parse('/path/to/file.%04d.ext [1, 2, 5-10]')
パターンを文字列で用意して、パースしてもらうことでも
コレクションを作れます。

この文字列は、コレクションの format メソッドで確認できます。
dpx.format()
'file.%04d.dpx [1-2, 10]'


…と、書いたところで、
連番の抜けチェック以外何に使ったらおいしいんだろう…
って悩ましくなった次第ですw

0 件のコメント:

コメントを投稿