6. python - ファイルの更新日付を変更する

 
6.1 参考にしたサイト
6.2 ファイルの更新日付を変更する
6.3 解説
6.4 修正

6.1 参考にしたサイト

 下記を参考にさせていただきました。
ファイルの属性を変更する
 実は、ここんとこ(2017年11月~12月)python をさわっていたのはこれが目的だったのです。  perl なら1日もあればできると思いますが、そこは勉強がてらということで。

6.2 ファイルの更新日付を変更する


#!/usr/local/bin/python3
# -*- coding: utf-8 -*-

import os
import time
import sys

dirname = sys.argv[1]                       #    第一引数でディレクトリを指定
setdate = sys.argv[2]                       #    第二引数で日付を指定

inp = input(dirname+ ' 配下のファイルの更新日付を\n '+ setdate[0:4] + '年'+ setdate[4:6] + '年'+ setdate[6:8] + '日に設定しますがよろしいですか?')

if (inp != 'Y' and inp != 'y'): sys.exit()

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

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 file in find_all_files(dirname):
    root, ext = os.path.splitext(file)
    if (ext == '.py'): os.utime(file, (atime, mtime))

6.3 解説


inp = input(dirname+ '・・・')
 は、input で標準入力からの取り込みを行い、inp に入力しています。  input の引数は、プロンプトとして出力されます。

    root, ext = os.path.splitext(file)
 は、ディレクトリ名とファイル名の文字列を、ディレクトリ名・ファイル名と拡張子に分割しています。  なんで、拡張子だけ分割されるかは、今のところ(2017年12月4日)謎。

    if (ext == '.py'): os.utime(file, (atime, mtime))
 は、拡張子は .py であったら、ファイルの参照日付と更新日付を、更新しています。  ちょっとはまったのが、拡張子の箇所が . がついていないと思い込んでしまってまして、全然更新されなくて、次項のデバッガを使う羽目になりました。  とここまでやって、拡張子も引数にしなければなぁと思いなおして

6.4 修正


#!/usr/local/bin/python3
# -*- coding: utf-8 -*-

import os
import time
import sys

if (len(sys.argv) != 4):
    print('引数を ディレクトリ 拡張子 日付 の形式で入力してください')
    sys.exit()

dirname = sys.argv[1]                       #    第一引数でディレクトリを指定
extname = sys.argv[2]                       #    第二引数で日付を指定
setdate = sys.argv[3]                       #    第三引数で日付を指定

inp = input(dirname+ ' 配下の' + \
            ' .' + extname +' ファイルの更新日付を\n ' + \
            setdate[0:4] + '年' + \
            setdate[4:6] + '月' + \
            setdate[6:8] + '日に設定しますがよろしいですか?')

if (inp != 'Y' and inp != 'y'): sys.exit()

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

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 file in find_all_files(dirname):
    root, ext = os.path.splitext(file)
    if (ext == '.' + extname): os.utime(file, (atime, mtime))

if (len(sys.argv) != 4):
    print('引数を ディレクトリ 拡張子 日付 の形式で入力してください')
    sys.exit()
 引数の個数チェックを増やしました。  if 文に複数の実行行が存在するときは、: コロンの後ろで改行し、タブでインデントして複数行書くことが分かりました。

inp = input(dirname+ ' 配下の' + \
            ' .' + extname +' ファイルの更新日付を\n ' + \
            setdate[0:4] + '年' + \
            setdate[4:6] + '月' + \
            setdate[6:8] + '日に設定しますがよろしいですか?')
 行が長いときは、\(バックスラッシュ)で次の行にわたって書けることが分かりました。  う~む。円記号を出力するエスケープ文字はあるものの、バックスラッシュを出力するエスケープ文字は調べられなかった。こういうのを片手落ちというのだ。