Python - ファイルの更新日付を変更する - .ini から .json へ

 クラウディア
1. 概要
2. ファイルの構成
3. モジュール

1. 概要

 「.ini」ファイルは、古い形式ですよ、ってことで。  パラメータファイルを「.ini」から「.json」へ変更することにしました。  「.ini」や「.json」に関しては、「テキストファイル形式」をご参照ください。  「.json」も「.json5」形式の方が使いやすいので、そちらを使うようにします。  「.json5」のパーサは、「pip」でインストールできます。  「FreeBSD」であれば、「ports」「pkg」に、「py-json5」のパッケージがあります。

2. ファイルの構成

 「.ini」で、下記のように記述していたものを(結局、複数書くとやたら行数の長いファイルになります)

[セクション名]
dirname = ディレクトリの絶対パス
extname = 設定するファイルの拡張子をホワイトスペースで区切って列挙
setdate = 更新日付として設定する日付を指定
 「.json」で下記のように記述します。

{
  "セクション名に書いていたもの": { dirname: "ディレクトリの絶対パス", extname: "設定するファイルの拡張子", setdate: "更新日付として設定する日付を指定",  },
  "...": 						  { dirname: "ディレクトリの絶対パス", extname: "設定するファイルの拡張子", setdate: "更新日付として設定する日付を指定",  },
}
 これで、項目を増やすのも楽になりました。

3. モジュール

 いささか試行錯誤しましたが(実は、前項のファイルの書き方が一番時間をとった)。  こんな感じになりました。

import os
import time
import json5

os.chdir(os.path.dirname(__file__))                     # モジュールの位置にディレクトリを移動

config = None

with open('update.json') as f:
  config = json5.load(f)

def find_all_files(directory):                          # 元となるディレクトリより配下のファイルを収集する
  for root, dirs, files in os.walk(directory):
    yield root
    for file in files:
      yield os.path.join(root, file)

for key, value in config.items():
  dirname = value['dirname']
  extname = value['extname']
  setdate = value['setdate']

  atime = mtime = time.mktime(time.strptime(setdate, '%Y%m%d'))

  for file in find_all_files(dirname):
    root, ext = os.path.splitext(file)
    if (ext == '.' + extname):
      os.utime(file, (atime, mtime))
 くっきり動作します(ちゅうか、運用しておりますぞよ)。
earthcar(アースカー)