写真のファイル名を撮影日と連番に一括で変える|元に戻せるPython

写真の名前を撮影日と連番(2026-05-03_001.jpg)にまとめて変えるPythonスクリプトを、AI(Claude)がはじめての人の4回の頼み方を想定して作りました。試し運転・実行・元に戻すの3段と、名前のぶつかりなどの不具合と直し方を載せています。

AI(Claude)が書き、運営者が確認して公開した記事です。分担と確かめたもの →

目次

スマホやデジカメから取り込んだ写真は、IMG_0001.jpg や DSC_0100.jpg のような名前で並びます。この名前を、撮った日付と連番の 2026-05-03_001.jpg にまとめて変えると、フォルダを名前の順に並べるだけで撮った順になります。

このレシピは、AI(Claude)が作って確かめた記録です。AIが「はじめての人がAIに送りそうな文」を4本想定し、その頼み方どおりに Python のスクリプトを書き、見本の写真で動かして、見つかった不具合を直しました。名前を変える前に一覧で確かめる「試し運転」と、あとから元の名前に戻す「元に戻す」を付けてあります。

先に結論:名前を変えるより「戻せるようにする」ほうが難しい

撮影日を読んで名前を付けるところは、短いコードで動きます。不具合が出たのは次の3か所です。

  • 撮影日が読めていなかった: 1回目は、7枚のうち5枚が「パソコンに取り込んだ日」の名前になった。エラーは出ない
  • 名前がぶつかって途中で止まった: 同じ名前の写真が既にあると、1枚だけ変わったところで止まり、元に戻せなかった
  • 途中で止まったときの戻し方: 直したあとも、途中で止まる場面を29通り試すと、15通りで元に戻らなかった

どんな写真を混ぜて試せば不具合が見つかるかも、頼み方と一緒に載せています。

このレシピでやること

表: このレシピでやること
項目 内容
作るもの 写真の名前を「撮影日_連番」に変えるスクリプト(rename_photos.py・176行)
できること 試し運転で一覧を出す/名前を変える/対応表(CSV)を使って元に戻す
撮影日の取り方 写真の EXIF(撮影情報)の撮影日時。無ければファイルの更新日時
AIに送る文 4回(作る1回+足す・直す3回)
確かめ方 見本の写真7枚で3段を通す(AI(Claude)は加えて、自動テスト14件)
必要なもの パソコン(Windows)、Python、Pillow、AIのチャット

EXIF(イグジフ)は、カメラやスマホが写真のファイルの中に書き込む撮影情報です。撮影日時のほか、機種や、設定によっては撮った場所(位置情報)も入ります。

作ったファイルはすべてこのサイトで見られます。

用意するもの

Python を入れる

Python(パイソン)は、スクリプト(パソコンに作業をさせる短いプログラム)を動かすためのソフトです。入れ方は「毎月のCSV集計をAIに任せる」の「STEP 1:Python を入れる」に書いています。AI(Claude)は Python 3.12 系で動かしました。

Pillow を入れる

Pillow(ピロー)は、Python で画像を扱うための追加の部品で、撮影日を読むのに使います。ターミナルで次のように打ちます。

AIに送る文
python -m pip install --upgrade Pillow

Pillow の公式ドキュメント(Basic Installation、2026年10月12日時点)の打ち方の python3 を、python に置き換えたものです。AI(Claude)は Pillow 12 系で動かしました。

練習用の写真のフォルダ

最初は練習用にコピーした写真で試してください。作業用のフォルダ(例: photo_rename)の中に photos フォルダを作り、写真を何枚かコピーします。

AIへの頼み方:4回の文と、そのたびに分かったこと

下の文は、そのままAIのチャットに貼り付けられます。出てくるコードがこのレシピと同じになるとは限りませんが、練習用のフォルダで試し運転 → 実行 → 元に戻すを通して確かめるところは同じです。

AIのチャットをどこで開けるかは「生成AIで何ができる?」にまとめています。

見本の写真:どんな写真を混ぜて試したか

AI(Claude)は、Pillow で単色の画像を7枚作って試しました。実在の写真や位置情報は使っていません。パソコンに取り込んだ日を 2026年5月10日と見立て、EXIF のある写真の更新日時はその日にしてあります。

表: 見本の写真:どんな写真を混ぜて試したか
ファイル名 撮影日(EXIF) 試したいこと
IMG_0001.jpg 2026-05-03 09:12:00 ふつうの写真
IMG_0002.jpg 2026-05-03 09:12:00 1枚目と同じ日時
IMG_0003.jpg 2026-05-03 14:30:10 同じ日の別の時刻
IMG_0004.JPG 2026-05-04 08:05:00 拡張子が大文字
DSC_0100.jpg なし(更新日時 2026-05-02) 撮影日が入っていない
scan_note.png なし(更新日時 2026-05-04) PNG の画像
2026-05-03_001.jpg 2026-05-06 12:00:00 新しい名前と同じ名前が既にある

ほかに、写真ではないファイル(memo.txt)を1つ入れました。名前が変わらないことを確かめるためです。

1回目:名前を変えてもらう

AIに送る文
フォルダの中の写真のファイル名を、撮った日付と連番に変えたいです。
例: IMG_0001.jpg → 2026-05-03_001.jpg
撮った日付が分からない写真は、ファイルの日付を使ってください。
Pythonで書いてください。プログラミングは初心者です。

AI(Claude)が書いた1回目のコードを見本のフォルダで動かすと、エラーは出ずに名前が変わりました。変わったあとのフォルダの中身は次のとおりです(どの元のファイルがどの番号になったかの対応は、記録していません)。

アプリの画面に出る結果(AIには送らない)
2026-05-02_001.jpg
2026-05-04_001.png
2026-05-10_001.jpg
2026-05-10_002.jpg
2026-05-10_003.jpg
2026-05-10_004.jpg
2026-05-10_005.jpg
memo.txt

撮影日が入っている5枚が、すべて取り込んだ日の名前になっています。撮影日を読めず、ファイルの更新日時に切り替わっていました。

EXIF の中は区画に分かれていて、撮影日時(DateTimeOriginal)は「Exif」という別の区画に入っています。1回目のコードは、Pillow の getexif() が返す最初の区画だけを探していました。読めないと黙って更新日時へ切り替える作りなので、エラーにもなりません。

しかも1回目はいきなり名前を変えるので、元の名前はどこにも残っていませんでした。

2回目:試し運転と、元に戻す方法を付けてもらう

AIに送る文
試したら、撮った日が違う写真まで全部 2026-05-10 になりました。2026-05-10 は写真をパソコンに取り込んだ日です。カメラの撮影日(EXIF)を読んでください。
それと、いきなり名前が変わるのは怖いです。次のようにしてください。
1. 最初は名前を変えずに「元の名前 → 新しい名前」の一覧を出すだけにする(試し運転)
2. 一覧でよければ、実行の指示をしたときだけ名前を変える
3. 元の名前と新しい名前の対応表をCSVで残して、それを使って元に戻せるようにする

2回目のコードは、撮影日を「Exif」の区画から読むように変わりました。使い方は3つに分かれます。

AIに送る文
python rename_photos.py photos
python rename_photos.py photos --run
python rename_photos.py photos --undo

1行目が試し運転、2行目(--run)が実行、3行目(--undo)が元に戻す、です。試し運転の一覧では、撮影日どおりの名前が並びました。ところが --run を付けると、途中で止まりました。

アプリの画面に出る結果(AIには送らない)
FileExistsError: [WinError 183] 既に存在するファイルを作成することはできません。: 'photos\\IMG_0001.jpg' -> 'photos\\2026-05-03_001.jpg'

その名前の写真(5月6日に撮った1枚)が既にあったためです。DSC_0100.jpg だけが名前を変えた状態で止まり、対応表は全部を変え終えてから書く作りだったので、できていません。--undo では戻せません。

また、--run を2回続けて打つと、2回目が対応表を「新しい名前 → 同じ名前」で上書きし、--undo で最初の名前に戻らなくなりました(名前のぶつからないフォルダで確認)。

Python の公式ドキュメント(pathlib の Path.rename、2026年10月12日時点)によると、同じ名前があるとき、Windows ではエラーになり、Mac などの Unix 系では黙って置き換えます。置き換えられた写真は消えます。Mac では試していません。

3回目:名前のぶつかりと、2回打ったときを直してもらう

AIに送る文
--run を付けたら、途中で次のエラーが出て止まりました。
FileExistsError: [WinError 183] 既に存在するファイルを作成することはできません。: 'photos\\IMG_0001.jpg' -> 'photos\\2026-05-03_001.jpg'
DSC_0100.jpg だけ名前が変わっていて、rename_log.csv はできていません。
もう1つ、うっかり --run を2回実行したら、rename_log.csv が上書きされて、--undo で最初の名前に戻らなくなりました。
次のように直してください。
1. 新しい名前と同じ名前のファイルが既にあっても、止まらずに全部の名前を変えられるようにする
2. 途中で止まっても元に戻せるように、名前を変える前に対応表を書き出す
3. 対応表が既にあるときは、上書きせずに止める
4. 一覧に、日付をEXIFから取ったのか、ファイルの更新日時から取ったのかを出す

エラー文の中のフォルダ名やファイル名は、自分の画面に出たものに書き換えます。

AI(Claude)は、付け替えを2段階に変えました。全部の写真をいったん __renaming__2026-05-03_001.jpg のような仮の名前にしてから、新しい名前にします。1段目で元の名前が全部空くので、ぶつかりません。対応表は名前を変える前に書き、既にあるときは --run を止めます。

見本の7枚では、試し運転・実行・元に戻すが通りました。名前のぶつかる 2026-05-03_001.jpg も、2026-05-06_001.jpg に変わりました。

4回目:テストを書いてもらい、途中で止まる場面を総当たりで試す

AIに送る文
最後に、名前がぶつかるとき・EXIFがない写真・元に戻す処理を確かめるテストを、unittest で書いてください。見本の画像はテストの中で作ってください。
名前を変えている途中で止まったとき(電源が切れたときなど)に、--undo で元に戻るかも確かめてください。

unittest は、Python に最初から入っているテストの道具です。AI(Claude)は、名前を変える処理をわざと途中で失敗させるテストを書きました。7枚を2段階で付け替えるので、付け替えは14回です。--run が1〜14回目のどこで止まっても戻るか、--undo が途中(付け替え14回と対応表の名前の変更1回)で止まっても戻るかの、29通りを試します。

3回目のコードでは、29通りのうち15通りで元に戻りませんでした。

  • --run の1段目(1〜7回目)で止まったとき: 7通りとも失敗
  • --undo の途中(8〜15回目)で止まったとき: 8通りとも失敗

原因は、ある写真の元の名前が、別の写真の新しい名前と同じことでした。1段目の途中で止まると、5月6日の写真はまだ元の名前 2026-05-03_001.jpg のままです。--undo はそれを、新しい名前になった IMG_0001.jpg だと取り違えました。名前だけでは、どこまで進んだかが分かりません。

AI(Claude)は、どこまで進んだかのメモ(__renaming__state.txt)を残すように直しました。--undo はメモを読み、止まっていた付け替えを済ませてから元に戻します。メモは付け替えが終わると消えます。直したあと、14件のテストはすべて合格しました。

できたもの

完成版は rename_photos.py です。

  • 対象は .jpg .jpeg .png .heic(大文字・小文字は区別しない)。ほかのファイルには触らない
  • 連番は日付ごとに001から、撮影日時の順。同じ日時なら元の名前の順。拡張子は小文字にそろえる
  • 対応表があるうちは --run を受け付けない。戻し終えた対応表は rename_log_undone.csv に名前を変えて残す

見本のフォルダで、試し運転をしたときの表示です。

アプリの画面に出る結果(AIには送らない)
DSC_0100.jpg → 2026-05-02_001.jpg  [更新日時 2026-05-02 18:40:00]
IMG_0001.jpg → 2026-05-03_001.jpg  [EXIF 2026-05-03 09:12:00]
IMG_0002.jpg → 2026-05-03_002.jpg  [EXIF 2026-05-03 09:12:00]
IMG_0003.jpg → 2026-05-03_003.jpg  [EXIF 2026-05-03 14:30:10]
IMG_0004.JPG → 2026-05-04_001.jpg  [EXIF 2026-05-04 08:05:00]
scan_note.png → 2026-05-04_002.png  [更新日時 2026-05-04 21:15:00]
2026-05-03_001.jpg → 2026-05-06_001.jpg  [EXIF 2026-05-06 12:00:00]
試し運転です(7件・名前は変えていません)。よければ --run を付けて実行してください

--run を付けると「7件の名前を変えました。対応表: rename_log.csv」と出て、--undo では「7件を元の名前に戻しました」と出ます。そのときの対応表は rename_log.csv です。列は old(元の名前)・new(新しい名前)・date(使った日時)・source(EXIF か更新日時か)で、Excel で開いても文字化けしにくい形式(BOM 付き UTF-8)で書いています。

使い方:試し運転 → 実行 → 元に戻す

rename_photos.py を作業用のフォルダ(photos と同じ階層)に保存します。AIの答えのコードをメモ帳に貼り付けて保存するときの手順と注意(ファイル名の最後が .py.txt にならないようにする、など)は、「毎月のCSV集計をAIに任せる」の「2. AI に頼む」と同じです。

作業用のフォルダの中で右クリックして「ターミナルで開く」を選び、次の順に打ちます。

  1. python rename_photos.py photos で一覧を出す。この時点では名前は変わらない。[更新日時 …] と出た写真は、撮影日が読めなかった写真なので、日付が合っているかを見る
  2. 一覧でよければ python rename_photos.py photos --run で名前を変える
  3. 戻したくなったら python rename_photos.py photos --undo を打つ

rename_log.csv は、--undo を打つまで動かしたり消したりしないでください。この表が無いと戻せません。次の写真の束で --run をするときは、前の表を別の場所に移します。

確かめたこと

  • 自動テスト 14件: rename_photos.py と同じフォルダで python -m unittest test_rename_photos -v を打つと動きます。AI(Claude)の実行では 14件すべて合格しました。テストの見本の画像は、テストのたびに一時フォルダへ作り直します
  • 撮影日: EXIF から読む/EXIF が無い・0000:00:00 00:00:00 のように壊れている・画像でないときは更新日時
  • 試し運転と実行: 試し運転では何も変わらない/ぶつかる名前も表どおりに変わる/2回目の --run は止まる
  • 元に戻す: 名前と中身が全部元どおり/2回くり返せる/途中で止まる29通りがすべて戻る
  • 中身が変わらないこと: 見本の7枚とメモ1つの中身から計算した値(ハッシュ)が、実行して元に戻したあとも同じでした。名前を変えても更新日時は変わりませんでした
  • HEIC の写真: iPhone などの HEIC は、Pillow 12 系では開けません(扱える拡張子の一覧に .heic がありませんでした)。このスクリプトでは更新日時の名前になります。HEIC を読む追加の部品(pillow-heif など)と、本物の HEIC の写真は試していません

⚠️ AI(Claude)が試したのは、Windows 11 と、Pillow で作った単色の見本の画像だけです。本物のカメラやスマホで撮った写真、Mac、ネットワーク上の共有フォルダでは試していません。練習用のフォルダで3段を通してから使ってください。

つまずいたこと

4回のやりとりで実際に出た不具合と、気づいたきっかけをまとめます。

表: つまずいたこと
不具合 気づいたきっかけ 直し方
撮影日が読めず、取り込んだ日の名前になる 名前を変えたあとの日付が全部 2026-05-10 だった 撮影日を EXIF の「Exif」の区画から読む
元の名前がどこにも残らない 1回目は名前を変える処理しかなかった 試し運転と対応表(CSV)と --undo を足す
同じ名前が既にあると途中で止まる 新しい名前と同じ名前の写真を混ぜた 仮の名前を通す2段階の付け替えにする
止まると対応表が無く戻せない 上と同じ 名前を変える前に対応表を書く
--run 2回で対応表が上書きされる --run を続けて2回打った 対応表があれば --run を止める
途中で止まると、別の写真と取り違える 止まる場所を29通り試すテスト どこまで進んだかのメモを残し、続きを済ませてから戻す

見つけにくかったのは1つ目と最後です。1つ目はエラーが出ないので、日付を一枚ずつ見ないと気づきません。最後の取り違えは、止まる場所を1つずつずらして試して、はじめて見つかりました。

気をつけること

写真の位置情報は、名前を変えても残る

スマホの設定によっては、写真の EXIF に撮った場所(GPS の緯度・経度)が入ります。このスクリプトは名前を変えるだけで、写真の中身は1バイトも書き換えません(上の「中身が変わらないこと」で確かめました)。つまり、位置情報が入った写真は、名前を変えたあとも位置情報が入ったままです。

写真を人に渡したり、インターネットに載せたりするときは、位置情報が入っていないかを先に確かめてください。Windows では、写真の「プロパティ」→「詳細」タブに「GPS」の欄が出るかで見られます(見本の画像には位置情報を入れていないので、この画面は確かめていません)。このスクリプトに位置情報を消す機能はありません。

AIに本物の写真や撮影情報を渡さない

AIに渡すのは、頼み方の文とエラーの文だけで足ります。写真や EXIF の中身を見せる必要はありません。個人情報保護委員会の生成AIサービスの利用に関する注意喚起(2023年6月2日)は、入力した個人情報が機械学習に使われるリスクを挙げ、利用規約やプライバシーポリシーを確かめるよう呼びかけています。エラーを貼るときも、フォルダの名前などに自分や家族の名前が入っていないかを先に見てください。

更新日時は「撮った日」とは限らない

更新日時は、画像を編集して保存すると変わり、取り込み方によっては取り込んだ日時になります(どの取り込み方で変わるかは確かめていません)。一覧で [更新日時 …] と出た写真は、日付を見てから --run してください。

AIが書いたコードには間違いが入ることがある

Claude のヘルプセンターも、Claude が間違った答えを出すことがあると案内しています(Claude is providing incorrect or misleading responses)。AIのコードが違う形ならこのレシピのテストは使えないので、見本の表のような写真を練習用のフォルダに集めて、3段を手で通してください。

自分で変えてみる

変えたいところを、AIに続けて頼みます。次の文は、AI(Claude)は試していません。直してもらったら、練習用のフォルダで3段をもう一度通してください。

動画も対象にする

AIに送る文
.mp4 と .mov の動画も対象にしてください。動画の撮影日が読めないときは、ファイルの更新日時を使ってください。

動画の撮影日は、写真の EXIF とは別の形で入っていて、Pillow では読めません。このレシピのスクリプトのままだと、動画は対象の外です。

次の一歩

作るのページで、ほかのカテゴリも見る →

この記事について

この記事でやった人

やったこと誰が
Pillow で単色の見本の写真7枚と memo.txt を作るAI(Claude)
はじめての人がAIに送りそうな4つの文を考えるAI(Claude)
その文を受けてスクリプトと unittest のテストを書き、不具合を直す(AIチャットの役)AI(Claude)
見本のフォルダで試し運転・実行・元に戻すを通し、自動テスト14件を実行し、ハッシュで中身が変わらないことを確かめるAI(Claude)
記録と記事を書くAI(Claude)
公開前の目視確認と公開の判断運営者

料金や仕様は変わることがあります。検証日より後の変更は、各サービスの公式情報で確かめてください。