[Python] ファイルの作成・更新日時を取得する方法

Pythonでファイルの作成・更新日時を取得するには、標準ライブラリのosモジュールやpathlibモジュールを使用します。

os.path.getctime()でファイルの作成日時、os.path.getmtime()で更新日時を取得できます。

また、pathlib.Pathオブジェクトのstat()メソッドを使うと、st_ctimeで作成日時、st_mtimeで更新日時を取得可能です。

これらのメソッドはUNIXとWindowsで動作が異なる場合があるため、注意が必要です。

この記事でわかること
  • Pythonでファイルの日時を取得する方法
  • 作成日時と更新日時の差を計算する方法
  • 複数ファイルの更新日時を比較する方法
  • ファイルのバックアップを作成する手法
  • 更新日時を基にファイルを削除する方法

目次から探す

ファイルの作成・更新日時を取得する基本的な方法

osモジュールを使った方法

os.path.getctime()で作成日時を取得

os.path.getctime()関数を使用すると、指定したファイルの作成日時を取得できます。

この関数は、ファイルのパスを引数に取り、作成日時をタイムスタンプ形式で返します。

import os
# ファイルのパスを指定
file_path = 'example.txt'
# 作成日時を取得
creation_time = os.path.getctime(file_path)
print(f'作成日時: {creation_time}')
作成日時: 1633036800.0

os.path.getmtime()で更新日時を取得

os.path.getmtime()関数を使用すると、指定したファイルの最終更新日時を取得できます。

この関数もファイルのパスを引数に取り、更新日時をタイムスタンプ形式で返します。

import os
# ファイルのパスを指定
file_path = 'example.txt'
# 更新日時を取得
modification_time = os.path.getmtime(file_path)
print(f'更新日時: {modification_time}')
更新日時: 1633036800.0

os.stat()を使った詳細な情報の取得

os.stat()関数を使用すると、ファイルに関する詳細な情報を取得できます。

この関数は、ファイルのパスを引数に取り、ファイルの状態を示すオブジェクトを返します。

import os
# ファイルのパスを指定
file_path = 'example.txt'
# ファイルの状態を取得
file_stat = os.stat(file_path)
# 作成日時と更新日時を表示
print(f'作成日時: {file_stat.st_ctime}')
print(f'更新日時: {file_stat.st_mtime}')
作成日時: 1633036800.0
更新日時: 1633036800.0

pathlibモジュールを使った方法

Pathオブジェクトのstat()メソッドを使う

pathlibモジュールを使用すると、よりオブジェクト指向的にファイルの情報を扱うことができます。

Pathオブジェクトのstat()メソッドを使うことで、ファイルの詳細な情報を取得できます。

from pathlib import Path
# ファイルのパスを指定
file_path = Path('example.txt')
# ファイルの状態を取得
file_stat = file_path.stat()
# 作成日時と更新日時を表示
print(f'作成日時: {file_stat.st_ctime}')
print(f'更新日時: {file_stat.st_mtime}')
作成日時: 1633036800.0
更新日時: 1633036800.0

st_ctimeで作成日時を取得

Pathオブジェクトのstat()メソッドを使用すると、st_ctime属性を使って作成日時を取得できます。

from pathlib import Path
# ファイルのパスを指定
file_path = Path('example.txt')
# 作成日時を取得
creation_time = file_path.stat().st_ctime
print(f'作成日時: {creation_time}')
作成日時: 1633036800.0

st_mtimeで更新日時を取得

同様に、st_mtime属性を使用して更新日時を取得することもできます。

from pathlib import Path
# ファイルのパスを指定
file_path = Path('example.txt')
# 更新日時を取得
modification_time = file_path.stat().st_mtime
print(f'更新日時: {modification_time}')
更新日時: 1633036800.0

ファイルの作成・更新日時をフォーマットする

datetimeモジュールを使った日時のフォーマット

タイムスタンプをdatetimeオブジェクトに変換

datetimeモジュールを使用すると、タイムスタンプをdatetimeオブジェクトに変換できます。

これにより、日時の操作やフォーマットが容易になります。

from datetime import datetime
import os
# ファイルのパスを指定
file_path = 'example.txt'
# 作成日時を取得
creation_time = os.path.getctime(file_path)
# タイムスタンプをdatetimeオブジェクトに変換
creation_datetime = datetime.fromtimestamp(creation_time)
print(f'作成日時: {creation_datetime}')
作成日時: 2021-10-01 00:00:00

strftime()で任意のフォーマットに変換

strftime()メソッドを使用すると、datetimeオブジェクトを任意のフォーマットに変換できます。

フォーマットは、指定した文字列に基づいて日時を表示します。

from datetime import datetime
import os
# ファイルのパスを指定
file_path = 'example.txt'
# 作成日時を取得
creation_time = os.path.getctime(file_path)
creation_datetime = datetime.fromtimestamp(creation_time)
# 任意のフォーマットに変換
formatted_time = creation_datetime.strftime('%Y年%m月%d日 %H時%M分%S秒')
print(f'フォーマットされた作成日時: {formatted_time}')
フォーマットされた作成日時: 2021年10月01日 00時00分00秒

timeモジュールを使った日時のフォーマット

time.ctime()で可読性の高い形式に変換

timeモジュールのctime()関数を使用すると、タイムスタンプを可読性の高い形式に変換できます。

この関数は、タイムスタンプを引数に取り、文字列形式で返します。

import time
import os
# ファイルのパスを指定
file_path = 'example.txt'
# 作成日時を取得
creation_time = os.path.getctime(file_path)
# 可読性の高い形式に変換
readable_time = time.ctime(creation_time)
print(f'可読性の高い作成日時: {readable_time}')
可読性の高い作成日時: Fri Oct  1 00:00:00 2021

time.strftime()でカスタムフォーマットに変換

time.strftime()を使用すると、タイムスタンプをカスタムフォーマットに変換できます。

この関数は、フォーマット文字列を指定して、日時を整形します。

import time
import os
# ファイルのパスを指定
file_path = 'example.txt'
# 作成日時を取得
creation_time = os.path.getctime(file_path)
# カスタムフォーマットに変換
formatted_time = time.strftime('%Y年%m月%d日 %H時%M分%S秒', time.localtime(creation_time))
print(f'カスタムフォーマットされた作成日時: {formatted_time}')
カスタムフォーマットされた作成日時: 2021年10月01日 00時00分00秒

ファイルの作成・更新日時を比較する

作成日時と更新日時の差を計算する

タイムスタンプの差を計算する方法

ファイルの作成日時と更新日時の差を計算するには、os.path.getctime()os.path.getmtime()を使用して、それぞれのタイムスタンプを取得し、その差を計算します。

import os
# ファイルのパスを指定
file_path = 'example.txt'
# 作成日時と更新日時を取得
creation_time = os.path.getctime(file_path)
modification_time = os.path.getmtime(file_path)
# タイムスタンプの差を計算
time_difference = modification_time - creation_time
print(f'作成日時と更新日時の差: {time_difference}秒')
作成日時と更新日時の差: 3600秒

datetimeオブジェクトを使った差分の計算

datetimeモジュールを使用すると、より直感的に日時の差分を計算できます。

datetimeオブジェクトを使って、差分をtimedeltaオブジェクトとして取得できます。

from datetime import datetime
import os
# ファイルのパスを指定
file_path = 'example.txt'
# 作成日時と更新日時を取得
creation_time = os.path.getctime(file_path)
modification_time = os.path.getmtime(file_path)
# datetimeオブジェクトに変換
creation_datetime = datetime.fromtimestamp(creation_time)
modification_datetime = datetime.fromtimestamp(modification_time)
# 差分を計算
time_difference = modification_datetime - creation_datetime
print(f'作成日時と更新日時の差: {time_difference}')
作成日時と更新日時の差: 1:00:00

複数ファイルの更新日時を比較する

複数ファイルの更新日時を取得してソート

複数のファイルの更新日時を比較するには、まずそれぞれのファイルの更新日時を取得し、リストに格納してソートします。

import os
# フォルダ内のファイルを取得
folder_path = 'example_folder'
files = os.listdir(folder_path)
# ファイル名と更新日時のタプルを作成
file_mod_times = [(file, os.path.getmtime(os.path.join(folder_path, file))) for file in files]
# 更新日時でソート
sorted_files = sorted(file_mod_times, key=lambda x: x[1], reverse=True)
# ソート結果を表示
for file, mod_time in sorted_files:
    print(f'ファイル: {file}, 更新日時: {mod_time}')
ファイル: file3.txt, 更新日時: 1633036800.0
ファイル: file1.txt, 更新日時: 1633036700.0
ファイル: file2.txt, 更新日時: 1633036600.0

最新のファイルを特定する方法

ソートした結果から最新のファイルを特定するには、リストの最初の要素を取得します。

import os
# フォルダ内のファイルを取得
folder_path = 'example_folder'
files = os.listdir(folder_path)
# ファイル名と更新日時のタプルを作成
file_mod_times = [(file, os.path.getmtime(os.path.join(folder_path, file))) for file in files]
# 更新日時でソート
sorted_files = sorted(file_mod_times, key=lambda x: x[1], reverse=True)
# 最新のファイルを特定
latest_file = sorted_files[0]
print(f'最新のファイル: {latest_file[0]}, 更新日時: {latest_file[1]}')
最新のファイル: file3.txt, 更新日時: 1633036800.0

ファイルの作成・更新日時を使った応用例

一定期間内に更新されたファイルをリストアップする

更新日時を条件にフィルタリングする方法

特定の期間内に更新されたファイルをリストアップするには、各ファイルの更新日時を取得し、指定した期間内にあるかどうかを確認します。

import os
import time
from datetime import datetime, timedelta
# フォルダのパスを指定
folder_path = 'example_folder'
# 現在の日時
now = time.time()
# 一定期間(例:7日間)を設定
time_limit = now - (7 * 24 * 60 * 60)
# 更新日時が一定期間内のファイルをリストアップ
recent_files = []
for file in os.listdir(folder_path):
    file_path = os.path.join(folder_path, file)
    if os.path.isfile(file_path):
        modification_time = os.path.getmtime(file_path)
        if modification_time > time_limit:
            recent_files.append(file)
print('最近更新されたファイル:')
for file in recent_files:
    print(file)
最近更新されたファイル:
file1.txt
file2.txt

フォルダ内のファイルを一括でチェックする

上記の方法を使って、フォルダ内のすべてのファイルを一括でチェックし、更新日時に基づいてフィルタリングすることができます。

import os
import time
# フォルダのパスを指定
folder_path = 'example_folder'
# 現在の日時
now = time.time()
# 一定期間(例:30日間)を設定
time_limit = now - (30 * 24 * 60 * 60)
# 更新日時が一定期間内のファイルをリストアップ
recent_files = [file for file in os.listdir(folder_path) if os.path.isfile(os.path.join(folder_path, file)) and os.path.getmtime(os.path.join(folder_path, file)) > time_limit]
print('最近更新されたファイル:')
for file in recent_files:
    print(file)
最近更新されたファイル:
file3.txt
file4.txt

古いファイルを自動で削除する

更新日時を基にファイルを削除するスクリプト

特定の期間以上更新されていないファイルを自動で削除するスクリプトを作成できます。

import os
import time
# フォルダのパスを指定
folder_path = 'example_folder'
# 一定期間(例:90日間)を設定
time_limit = time.time() - (90 * 24 * 60 * 60)
# 古いファイルを削除
for file in os.listdir(folder_path):
    file_path = os.path.join(folder_path, file)
    if os.path.isfile(file_path) and os.path.getmtime(file_path) < time_limit:
        os.remove(file_path)
        print(f'削除しました: {file}')
削除しました: old_file.txt

削除前に確認する処理を追加する方法

削除する前にユーザーに確認を求める処理を追加することができます。

import os
import time
# フォルダのパスを指定
folder_path = 'example_folder'
# 一定期間(例:90日間)を設定
time_limit = time.time() - (90 * 24 * 60 * 60)
# 古いファイルを削除する前に確認
for file in os.listdir(folder_path):
    file_path = os.path.join(folder_path, file)
    if os.path.isfile(file_path) and os.path.getmtime(file_path) < time_limit:
        confirm = input(f'削除しますか? {file} (y/n): ')
        if confirm.lower() == 'y':
            os.remove(file_path)
            print(f'削除しました: {file}')
削除しますか? old_file.txt (y/n): y
削除しました: old_file.txt

ファイルのバックアップを作成する

更新日時を基にバックアップを作成する

ファイルの更新日時を基にバックアップを作成するスクリプトを作成できます。

更新日時が新しいファイルをバックアップフォルダにコピーします。

import os
import shutil
import time
# フォルダのパスを指定
source_folder = 'example_folder'
backup_folder = 'backup_folder'
# 現在の日時
now = time.time()
# 一定期間(例:1日間)を設定
time_limit = now - (1 * 24 * 60 * 60)
# 更新日時が一定期間内のファイルをバックアップ
for file in os.listdir(source_folder):
    file_path = os.path.join(source_folder, file)
    if os.path.isfile(file_path) and os.path.getmtime(file_path) > time_limit:
        shutil.copy(file_path, backup_folder)
        print(f'バックアップしました: {file}')
バックアップしました: file1.txt
バックアップしました: file2.txt

バックアップファイルの命名規則を設定する

バックアップファイルの命名規則を設定することで、元のファイル名にタイムスタンプを追加することができます。

import os
import shutil
import time
# フォルダのパスを指定
source_folder = 'example_folder'
backup_folder = 'backup_folder'
# 現在の日時
now = time.time()
# 一定期間(例:1日間)を設定
time_limit = now - (1 * 24 * 60 * 60)
# 更新日時が一定期間内のファイルをバックアップ
for file in os.listdir(source_folder):
    file_path = os.path.join(source_folder, file)
    if os.path.isfile(file_path) and os.path.getmtime(file_path) > time_limit:
        timestamp = time.strftime('%Y%m%d_%H%M%S', time.localtime())
        backup_file_name = f'{file}_{timestamp}'
        shutil.copy(file_path, os.path.join(backup_folder, backup_file_name))
        print(f'バックアップしました: {backup_file_name}')
バックアップしました: file1.txt_20231001_120000
バックアップしました: file2.txt_20231001_120000

よくある質問

ファイルの作成日時が正しく取得できないのはなぜ?

ファイルの作成日時が正しく取得できない場合、いくつかの理由が考えられます。

  • ファイルシステムの違い: 一部のファイルシステム(特に古いものや特定の設定がされているもの)では、作成日時が記録されないことがあります。
  • OSのバージョン: 使用しているオペレーティングシステムのバージョンによっては、作成日時の取得方法が異なる場合があります。
  • ファイルの移動: ファイルを別の場所に移動した場合、作成日時が変更されることがあります。

特に、異なるファイルシステム間での移動では注意が必要です。

WindowsとUNIXでの動作に違いはある?

はい、WindowsとUNIX系(LinuxやmacOSなど)では、ファイルの作成日時や更新日時の扱いに違いがあります。

  • 作成日時のサポート: Windowsでは、ファイルの作成日時が明確に記録されますが、UNIX系では、作成日時がサポートされていない場合があります(特に古いファイルシステム)。
  • タイムスタンプの精度: UNIX系のファイルシステムでは、タイムスタンプの精度が異なる場合があり、ミリ秒単位での精度がないことがあります。
  • コマンドやAPIの違い: ファイルの日時を取得するためのコマンドやAPIが異なるため、同じ操作を行う場合でも、使用する関数やメソッドが異なることがあります。

ファイルのアクセス日時も取得できる?

はい、ファイルのアクセス日時も取得できます。

Pythonのosモジュールやpathlibモジュールを使用することで、アクセス日時を取得することが可能です。

  • osモジュール: os.path.getatime()を使用すると、ファイルの最終アクセス日時を取得できます。
  • pathlibモジュール: Pathオブジェクトのstat()メソッドを使用し、st_atime属性を参照することでアクセス日時を取得できます。
import os
# ファイルのパスを指定
file_path = 'example.txt'
# アクセス日時を取得
access_time = os.path.getatime(file_path)
print(f'アクセス日時: {access_time}')

このように、アクセス日時も簡単に取得することができます。

まとめ

この記事では、Pythonを使用してファイルの作成日時や更新日時を取得する方法について詳しく解説しました。

また、これらの日時をフォーマットしたり、比較したりする方法、さらには応用例として特定の条件に基づいてファイルをリストアップしたり、古いファイルを削除したり、バックアップを作成する方法についても触れました。

これらの知識を活用することで、ファイル管理やデータ処理の効率を向上させることができるでしょう。

ぜひ、実際のプロジェクトや日常のタスクにこれらのテクニックを取り入れて、より効果的なファイル操作を行ってみてください。

  • URLをコピーしました!
目次から探す