【Python】ファイルのタイムスタンプを変更するコード例【作成日時・更新日時・アクセス日時を変更する】

スポンサーリンク

Pythonでファイルのタイムスタンプを変更するコード例です(Windows用)。

win32_setctime.setctime() と os.utime() を使って、ファイルの作成日時更新日時アクセス日時を変更します。

win32_setctime は、作成日時を変更するための外部ライブラリです。

win32-setctime · PyPI

GitHub – 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 マニュアルの場所

コード例で使用した関数・クラス・メソッドのマニュアルです。

datetime.timestamp()

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.setctime() で変更できたのはファイルだけでした。

フォルダの作成日時は、変更できませんでした (win32-setctime 1.0.1)。

win32_setctime.setctime() にフォルダを渡したところ、以下のエラーが表示されました。

PermissionError: [WinError 5] アクセスが拒否されました。

ファイルの作成日時に限定した、シンプルなライブラリです。

なぜ作成日時の変更だけがむずかしいのか?(参考サイト)

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() の作者の方もいました。ライブラリとして簡単に使えるようになっていて、とてもありがたいです。

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