Python 業務自動化 | ファイル・フォルダ自動化:基本操作 - ファイル作成日時取得

Python Python
スポンサーリンク

「ファイル作成日時取得」は“いつ生まれたか”を知るための情報

業務自動化をしていると、
「このファイルはいつ作られたものか?」
「古いファイルだけアーカイブしたい」
「一定期間より前に作られたファイルを削除したい」
といったニーズが出てきます。

そこで使うのが「ファイルの作成日時」です。
Pythonでは主に os.path.getctime()pathlib を使って取得しますが、
ここには“ちょっとした落とし穴”もあるので、そこも含めて丁寧に解説していきます。


基本の関数:os.path.getctime で作成日時を取る

いちばんシンプルなコード

まずは「1つのファイルの作成日時を取得して表示する」最小コードです。

import os
from datetime import datetime

path = "data/report.csv"

timestamp = os.path.getctime(path)
dt = datetime.fromtimestamp(timestamp)

print("作成日時:", dt)
Python

os.path.getctime(path) は、そのファイルの「作成に関するタイムスタンプ」を
UNIXタイムスタンプ(エポック秒)で返します。

datetime.fromtimestamp() で、人間が読める「日付+時刻」に変換しています。

ここでまず押さえておきたいのは、
「getctime が返すのは“秒数”で、そのままだと読みにくい」
「datetime に変換して初めて“業務で使える情報”になる」
という二段構えになっていることです。


重要ポイントを深掘り:OSによって「意味」が違う

WindowsとUnix系での違い

ここが一番大事なポイントです。

os.path.getctime() の “c” は「creation(作成)」ではなく、
もともとは「change(変更)」を意味します。

Windowsでは「作成日時」を返すことが多いですが、
Linuxや一部のUnix系では「メタデータが最後に変更された時刻」を返します。

メタデータとは、所有者・パーミッション・サイズなどの情報で、
「ファイルの中身を変えていなくても、権限を変えただけで ctime が更新される」ことがあります。

つまり、

  • Windowsでは「作成日時」として使えることが多い
  • Unix系では「厳密な意味での作成日時」とは限らない

という前提を知っておく必要があります。

業務で「正確な作成日時が絶対に必要」というケースなら、
OS依存の挙動を理解したうえで設計するか、
「更新日時(mtime)を基準にする」という割り切りも選択肢になります。


存在しないファイルを指定したときの挙動

FileNotFoundError を避けるための存在確認

os.path.getctime() は、ファイルが存在しないと FileNotFoundError を投げます。

業務バッチでこれをやると、夜中の処理が途中で落ちてしまいます。
そこで、「作成日時を取る前に存在確認をする」のが安全な書き方です。

import os
from datetime import datetime

path = "data/report.csv"

if not os.path.isfile(path):
    print("エラー: ファイルが見つかりません:", path)
else:
    ts = os.path.getctime(path)
    dt = datetime.fromtimestamp(ts)
    print("作成日時:", dt)
Python

ここでは os.path.isfile() を使って、「存在する」かつ「ファイルである」ことを確認しています。
「存在確認 → 作成日時取得」という順番をテンプレートとして覚えておくと、エラーをかなり減らせます。


例題①:古いファイルだけをアーカイブフォルダへ移動する

シナリオ

data フォルダにファイルがたくさんあり、
「30日より前に作られたファイルだけを archive フォルダに移動したい」というケースを考えます。

コード例

import os
import shutil
from datetime import datetime, timedelta

src_dir = "data"
dst_dir = "archive"
days = 30

os.makedirs(dst_dir, exist_ok=True)

limit = datetime.now() - timedelta(days=days)

for name in os.listdir(src_dir):
    src_path = os.path.join(src_dir, name)

    if not os.path.isfile(src_path):
        continue

    ts = os.path.getctime(src_path)
    created_at = datetime.fromtimestamp(ts)

    if created_at < limit:
        dst_path = os.path.join(dst_dir, name)
        shutil.move(src_path, dst_path)
        print("アーカイブ:", created_at, "→", dst_path)
Python

ここでやっていることを整理すると、

  1. 「候補を全部取る」
  2. 「ファイルだけに絞る」
  3. 「作成日時を datetime に変換する」
  4. 「基準日より古いかどうかで判定する」
  5. 「古いものだけアーカイブに移動する」

という流れになっています。

「作成日時を基準にして動く処理」を一つ書けると、
「何日前より前のデータをアーカイブする」「何日前より前のログを削除する」など、
業務でよくあるパターンにそのまま応用できます。


例題②:フォルダ内で「一番古いファイル」を見つける

シナリオ

inbox フォルダにファイルがたくさんあり、
「一番古いファイルから順に処理したい」というケースです。

コード例

import os
from datetime import datetime

folder = "inbox"

oldest_path = None
oldest_ts = None

for name in os.listdir(folder):
    path = os.path.join(folder, name)

    if not os.path.isfile(path):
        continue

    ts = os.path.getctime(path)

    if oldest_ts is None or ts < oldest_ts:
        oldest_ts = ts
        oldest_path = path

if oldest_path is None:
    print("処理対象のファイルがありません")
else:
    dt = datetime.fromtimestamp(oldest_ts)
    print("最も古いファイル:", dt, ":", oldest_path)
    # ここで oldest_path を使って処理を書く
Python

このテンプレートは、「古い順に処理する」「古いものから削除する」など、
業務でそのまま使える場面が多いです。


例題③:作成日時をレポートに出力する

シナリオ

ファイル一覧レポートを作るときに、
「ファイル名・サイズ・作成日時」をまとめて出したい、というケースです。

コード例

import os
from datetime import datetime

folder = "data"

for name in os.listdir(folder):
    path = os.path.join(folder, name)

    if not os.path.isfile(path):
        continue

    size = os.path.getsize(path)
    ts = os.path.getctime(path)
    created_at = datetime.fromtimestamp(ts)

    print(f"{name}\t{size} bytes\t{created_at}")
Python

このように、「作成日時」を他の情報(サイズ・更新日時など)と組み合わせることで、
「いつ・どれくらいの大きさのファイルが作られたか」を一覧で把握できます。


pathlib を使った、少しモダンな書き方

Path.stat().st_ctime で作成日時相当を取る

pathlib を使うと、パス操作とタイムスタンプ取得をオブジェクト指向っぽく書けます。

from pathlib import Path
from datetime import datetime

p = Path("data/report.csv")

if p.is_file():
    ts = p.stat().st_ctime
    dt = datetime.fromtimestamp(ts)
    print("作成日時相当:", dt)
else:
    print("ファイルがありません:", p)
Python

st_ctime は、os.path.getctime() と同じく「作成またはメタデータ変更の時刻」です。
OSによる意味の違いはそのままなので、
「Windowsでは作成日時として使えることが多い」「Unix系では厳密な作成日時とは限らない」
という前提は変わりません。


もう一歩だけ深掘り:作成日時にこだわりすぎないという選択肢

実務では「更新日時」を使う方が安定することも多い

ここまで「作成日時」にフォーカスしてきましたが、
実務では「いつ中身が最後に変わったか(更新日時)」を基準にする方が、
OS差も少なく、意図に近いことが多いです。

「いつ作られたか」よりも「いつ最後に使われたか・更新されたか」が知りたいなら、
getctime ではなく getmtime を使う方が素直です。

とはいえ、「作成日時を見たい」という要件自体はよくあるので、
「OSによって意味が違う」「Windows前提ならほぼ作成日時として使える」
という前提を理解したうえで使うのが、現実的な落としどころです。


まとめ:「いつ作られたか」を知ると、ファイルの“寿命設計”ができる

ファイル作成日時取得は、一見マニアックに見えますが、
業務自動化では次のような場面で大きな力を発揮します。

古いファイルだけをアーカイブ・削除する。
一番古いファイルから順に処理する。
レポートやログに「いつ作られたか」を残しておく。

そのための基本ツールが os.path.getctime()datetime.fromtimestamp() です。

まずは、あなたのPCにある適当なフォルダを一つ決めて、
今日の「古いファイルを探す」コードをそのまま動かしてみてください。

「このファイル、こんな前に作られてたのか」という感覚が一度つかめると、
「じゃあ◯日より前のものは自動でアーカイブしよう」
「一定期間を過ぎたら削除しよう」
といった“寿命設計”を、自然にコードに落とし込めるようになっていきます。

タイトルとURLをコピーしました