akuruhinode's blog

pythonやC#を中心に興味を持った内容について調べています。

Python 最近更新されたファイルのリストをCSVで保存

はじめに

PCを利用しているといつの間にかファイルが増えていき、ストレージ容量が不足してしまうことがあります。自分で作成、保存したファイルであれば手動で管理できるのですが、OSやアプリが自動生成するファイルについては管理が難しいという課題を抱えていました。

特にサイズが大きいファイルであればまだ分かりやすいのですが、小さなファイルが大量に作成される場合は調査が難しい状況でした。
そこで、ここでは特定の日付以降に更新されたファイルのリストを出力するスクリプトを作成しました。

バージョン情報

python: 3.7.9
pandas: 1.2.3

ソースコード

ソースコードと使用例は以下の通りです。

メインの処理

import os
import glob
import datetime
import pandas as pd

# 指定した日付以降更新されたファイルのリストを保存する
def save_updated_files(save_name, files, date, get_size=False):
    updated_files = []

    for path in files:
        if not os.path.isfile(path):
            continue

        try:
            # 更新日を取得
            updated_time = os.path.getmtime(path)
            updated_time = datetime.datetime.fromtimestamp(updated_time)
            # 更新日の比較
            if updated_time >= date:
                info = [path, updated_time]
                # ファイルサイズを取得する(オプション)
                if get_size:
                    info.append(os.path.getsize(path))

                updated_files.append(info)

        # ファイルにアクセスできない場合は除外する
        except OSError: 
            continue

    print('files:', len(updated_files))

    columns = ['file', 'date']
    if get_size:
        columns.append('size(bytes)')

    # CSVで保存
    df = pd.DataFrame(updated_files, columns=columns)
    df.to_csv(save_name, index=False, encoding='shift_jis')

使用例

# ファイルのリストを取得
file_list = glob.glob(r'C:\example\**\*.*', recursive=True)

# 2021年1月1日以降更新されたファイルのリストを保存する
save_updated_files('updated_files.csv',
                  file_list, datetime.datetime(2021, 1, 1, 0, 0, 0), get_size=True)

引数

  • save_name:出力するCSVファイルの名前
  • files:ファイルリスト
  • date:基準とする日付(datetime型)
  • get_size:サイズを出力するかどうか

補足

検索対象のファイルリスト(フォルダ)については自由度があったほうが良いと思い、ここでは関数の外で処理しています。例えば特定のフォルダ内のファイルのみ対象にする、複数のフォルダのファイルを対象にする、特定の拡張子のファイルのみを対象にするなどです。

関数内の主要な処理はコメントの通りです。オプションとして引数でget_size=Trueとすることでファイルのサイズも取得できるようにしています。

注意点としては、ファイルにアクセスできない場合にはOSErrorが発生する可能性があるということです。ここではtry - except文で除外しています。