Pythonでファイルのタイムスタンプを変更するコード例です(Windows用)。
win32_setctime.setctime() と os.utime() を使って、『ファイル』の作成日時・更新日時・アクセス日時を変更します。
win32_setctime は、作成日時を変更するための外部ライブラリです。
GitHub – Delgan/win32-setctime
(2020年10月18日 追記)『win32-setctime 1.0.3』から、フォルダの作成日時変更にも対応したとのことでした。とてもありがたいです。
(GitHub) Support for changing ctime for directories · Issue #3 · Delgan/win32-setctime
以下のように、pip でインストールして使います。
pip install win32-setctime
タイムスタンプを変更するコードです。
win32_setctime.setctime(file, 作成日時)
os.utime(file, (アクセス日時, 更新日時))
できれば、os.utime() だけで完結させたいところですが、作成日時に関してはOSごとに扱いが異なるようで、対応していませんでした。
以下、コード例の全体と解説です。
タイムスタンプを変更するコード例
ファイルの作成日時・更新日時・アクセス日時を変更する Python コード例です。
Windows 用です。
"""Pythonでファイルのタイムスタンプを変更するコード例 (Windows用)"""
import os
import datetime
import win32_setctime
# (1/3) ファイルパスを決める
file = r"*****\memo.txt"
# (2/3) 作成日時、更新日時、アクセス日時を決める。
ctime = datetime.datetime(2011, 1, 2, 11, 12, 13).timestamp()
mtime = datetime.datetime(2014, 4, 5, 14, 15, 16).timestamp()
atime = datetime.datetime(2017, 7, 8, 17, 18, 19).timestamp()
# (3/3) タイムスタンプを変更
win32_setctime.setctime(file, ctime)
os.utime(file, (atime, mtime))
# (デバッグ) タイムスタンプを取得して表示
t = os.stat(file)
print(' 作成日時: %s' % datetime.datetime.fromtimestamp(t.st_ctime))
print(' 更新日時: %s' % datetime.datetime.fromtimestamp(t.st_mtime))
print('アクセス日時: %s' % datetime.datetime.fromtimestamp(t.st_atime))
実行結果です。
作成日時: 2011-01-02 11:12:13
更新日時: 2014-04-05 14:15:16
アクセス日時: 2017-07-08 17:18:19
3つの日時を、指定した通りに設定できました。
以上です。
Python マニュアルの場所
コード例で使用した関数・クラス・メソッドのマニュアルです。
os.utime(path, times=None, *, [ns, ]dir_fd=None, follow_symlinks=True)
os.stat(path, *, dir_fd=None, follow_symlinks=True)
classmethod datetime.fromtimestamp(timestamp, tz=None)
win32_setctime の制約
旧バージョンは『ファイル』のみの対応
旧バージョンの win32-setctime 1.0.1 では、『ファイル』の作成日時だけが変更可能でした。
フォルダの作成日時は、変更できませんでした 。
win32_setctime.setctime() にフォルダを渡したところ、以下のエラーが表示されました。
PermissionError: [WinError 5] アクセスが拒否されました。
新しいバージョンは『ファイル』と『フォルダ』の変更に対応
新しいバージョンの『win32-setctime 1.0.3』では、『ファイル』と『フォルダ』の両方の作成日時変更に対応した、とのことでした。
(GitHub) Support for changing ctime for directories · Issue #3 · Delgan/win32-setctime
なぜ作成日時の変更だけがむずかしいのか?(参考サイト)
Python の標準ライブラリには、ファイルの作成日時を簡単に変更するための関数がありませんでした。
なぜ作成日時の変更だけがむずかしいのか?
おそらくですが、『作成日時(作成時刻)のデータだけが、プラットフォーム依存である』というのが理由のようでした。
『アクセス日時(アクセス時刻)』と『更新日時(更新時刻)』は共通だけど、『作成日時』に関しては、OSやファイルシステムによって扱いが異なる。
そういうわけで、os.utime() にまとめることが難しかったんだと思います。
参考にしたサイトのページを紹介します。
os — 雑多なオペレーティングシステムインタフェース — Python
リンクは os.stat_result クラスの st_ctime 属性の説明のところです。
Windows で作成日時(作成時刻)として使っている部分が、Unix では別の用途に使っている旨が書かれていました。
How do I change the file creation date of a Windows file from Python? – Stack Overflow
スタックオーバーフローのページです。
Python でファイルの作成日時を変更するためのコード例が、たくさん寄せられていました。基本的には、Python から Win32API の SetFileTime() を呼び出して変更するようです。
本記事で使わせていただいた win32_setctime.setctime() の作者の方もいました。ライブラリとして簡単に使えるようになっていて、とてもありがたいです。