バリケンのPython日記 RSSフィード

2009-02-11

[] あるディレクトリ以下のjpgファイルすべてを出力する  あるディレクトリ以下のjpgファイルすべてを出力する - バリケンのPython日記 を含むブックマーク はてなブックマーク -  あるディレクトリ以下のjpgファイルすべてを出力する - バリケンのPython日記  あるディレクトリ以下のjpgファイルすべてを出力する - バリケンのPython日記 のブックマークコメント

あるディレクトリ以下にある、すべてのjpgファイルに対して何かを操作したい、というときがあるよね。たとえばEドライブの中にあるjpgファイルをすべて出力するには、次のようにすればいいみたい。

import os
import glob

for root, dirs, files in os.walk("E:\\"):
  for fname in glob.glob(os.path.join(root, "*.jpg")):
    print fname

[] EXIF.py  EXIF.py - バリケンのPython日記 を含むブックマーク はてなブックマーク -  EXIF.py - バリケンのPython日記  EXIF.py - バリケンのPython日記 のブックマークコメント

デジタルカメラで撮影したjpgファイルには、EXIFというさまざまな情報が含まれているみたいだよ。その情報にアクセスするためには、EXIF.pyというライブラリを使えばいいみたい。

使い方はまた今度。

[] 写真の整理  写真の整理 - バリケンのPython日記 を含むブックマーク はてなブックマーク -  写真の整理 - バリケンのPython日記  写真の整理 - バリケンのPython日記 のブックマークコメント

じゃあ、EXIFライブラリを使って、デジタルカメラで撮影した写真を日付ごとのフォルダに分けてコピーするスクリプトを書いてみるよ。デジタルカメラメモリーカードがEドライブ、自分の画像フォルダがD:\Users\muscovyduck\Picturesだとすると、次のようになるよ。

# -*- coding: utf-8 -*-

import os
import glob
import shutil
import EXIF

src_dir = "E:\\DCIM"
dest_dir = "D:\\Users\\muscovyduck\\Pictures"

if os.path.exists(dest_dir) == False:
  os.mkdir(dest_dir)

for root, dirs, files in os.walk(src_dir):
  for fname in glob.glob(os.path.join(root, "*.jpg")):
    date = str(EXIF.process_file(open(fname, 'rb'))['Image DateTime'])
    year, month, day = date[:4], date[5:7], date[8:10]
    year_dir = os.path.join(dest_dir, year + u"")
    if os.path.exists(year_dir) == False:
      os.mkdir(year_dir)
    month_dir = os.path.join(year_dir, year + u"" + month + u"")
    if os.path.exists(month_dir) == False:
      os.mkdir(month_dir)
    day_dir = os.path.join(month_dir, year + month + day)
    if os.path.exists(day_dir) == False:
      os.mkdir(day_dir)
    dest = os.path.join(day_dir, os.path.basename(fname))
    if os.path.exists(dest) == False:
      shutil.copy2(fname, dest)

こうすると、たとえば2009年2月11日に撮影した写真は「2009年」フォルダの中の「2009年02月」フォルダの中の「20090211」フォルダの中にまとめてコピーされるよ。

JunJun_MathJunJun_Math2011/04/11 02:01バリケンさん、こちらのプログラム面白いとおもい、EXIF取ってきて使ってみたのですがエラーが出ました。下記のような感じです。どうかこちらのプログラム走らせてみたいのですがなぜだか教えてはいただけませんか?



Traceback (most recent call last):
File "C:\Python26\Lib\site-packages\xy\pics.py", line 16, in <module>
date = str(EXIF.process_file(open(fname, 'rb'))['Image DateTime'])
File "C:\Python26\Lib\site-packages\xy\EXIF.py", line 1688, in process_file
hdr.decode_maker_note()
File "C:\Python26\Lib\site-packages\xy\EXIF.py", line 1544, in decode_maker_note
dict=MAKERNOTE_CASIO_TAGS)
File "C:\Python26\Lib\site-packages\xy\EXIF.py", line 1353, in dump_IFD
values = self.file.read(count)
MemoryError

JunJun_MathJunJun_Math2011/04/12 12:48すみません。いくつか写真取り込まれています。途中でなんかしらの問題が起来ているようです。理由がわかりましたら教えてはいただけませんでしょうか?

ちなみにバージョンは2.6です。

muscovyduckmuscovyduck2011/04/13 14:46JunJun_Mathさん>
'Image DateTime'を'EXIF DateTimeOriginal'に変えてみると、どうでしょうか。

JunJun_MathJunJun_Math2011/04/18 12:56'Image DateTime'を'EXIF DateTimeOriginal'に変えてみると、下記のようなエラーが出ました。ただまたいくつか写真が読み込まれていました。

カシオのデジカメで撮ったのですが何か関係ありますかね???

Traceback (most recent call last):
File "C:\Python26\Lib\site-packages\xy\pics.py", line 16, in <module>
date = str(EXIF.process_file(open(fname, 'rb'))['EXIF DateTimeOriginal'])
File "C:\Python26\Lib\site-packages\xy\EXIF.py", line 1688, in process_file
hdr.decode_maker_note()
File "C:\Python26\Lib\site-packages\xy\EXIF.py", line 1544, in decode_maker_note
dict=MAKERNOTE_CASIO_TAGS)
File "C:\Python26\Lib\site-packages\xy\EXIF.py", line 1353, in dump_IFD
values = self.file.read(count)
MemoryError

トラックバック - http://python.g.hatena.ne.jp/muscovyduck/20090211