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

Python

Python でファイルとフォルダのタイムスタンプを変更するコード例です。

Windows 用です。

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

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

(pypi.org) win32-setctime · PyPI

(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 マニュアル

コード例で使用した Python 機能のマニュアルです。

(Python) datetime.timestamp()

(Python) os.utime(path, times=None, *, [ns, ]dir_fd=None, follow_symlinks=True)

(Python) os.stat(path, *, dir_fd=None, follow_symlinks=True)

(Python) 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() にまとめることが難しかったんだと思います。

参考にしたサイトのページを紹介します。

 

Python マニュアルのページです。

(Python) st_ctimeclass os.stat_result

(Python) stat.ST_CTIME

Windows で作成日時(作成時刻)として使っている部分が、Unix では別の用途に使っている旨が書かれていました。

 

スタックオーバーフローのページです。

(stackoverflow.com) How do I change the file creation date of a Windows file from Python?

Python でファイルの作成日時を変更するためのコード例が、たくさん寄せられていました。基本的には、Python から Win32API の SetFileTime() を呼び出して変更するようです。

本記事で使わせていただいた win32_setctime.setctime() の作者の方もいました。ライブラリとして簡単に使えるようになっていて、とてもありがたいです。

以上です。

PowerShellパワーシェル を使用した Python コード例も書きました。
⇒ 【Python】PowerShell でファイルとフォルダのタイムスタンプを変更するコード例

スポンサーリンク
シェアする(押すとSNS投稿用の『編集ページ』に移動します)
フォローする(RSSフィードに移動します)
スポンサーリンク
シラベルノート
タイトルとURLをコピーしました