pythonのtkinterでメモ帳作り_ファイルに更新があったらバックアップする

習慣化2_8日目

どこかで記事をまとめたいが、少しずつ進めたことをメモしていく。

作成した関数

def auto_backup():
    global file
    # ファイルの開かれた方法によってfileの中身が異なるので揃える
    if type(file) != str:
        file = file.name
    # ファイルのパスを取得
    file_path=os.path.dirname(file)
    # 現在のファイル名を取得する
    file_title_now=os.path.basename(file)
    # 現在のファイル名から位置情報・色情報・リマインダー・拡張子を取り除いた文字列を取得する。
    # これで同じファイルかどうか判断する。同じファイル名を使うこともあるかもだけど、まぁいいか。
    file_title_only=re.sub('\(\(.+\)\)|<.+>|【\[.+\]】|.txt', '',file_title_now)

    # もしBACKUPフォルダがなかったら作成する すでにあったら何もしない
    os.makedirs(file_path+'/BACKUP', exist_ok=True)

    # バックアップフォルダ内の同じタイトルファイルをリストで取得する
    backup_file_lists = list(Path(file_path+'/BACKUP').glob(file_title_only+'*.txt'))

    # もしリストが空だったら=初めてのバックアップだったらバックアップして終了
    if backup_file_lists == []:
        shutil.copy2(file, file_path+'/BACKUP/'+file_title_now)
        return

    # リストをファイル更新日で降順並び替え
    backup_file_lists.sort(key=os.path.getmtime, reverse=True)
    # リストの最初にいるファイル名=更新が最新のファイル名を取得する
    backup_file_latest=backup_file_lists[0].name #ic| backup_file_latest: 'as((644x188+104+14)).txt'

    # もし現在のファイルと最新バックアップファイルの内容に差があったらバックアップを実施する
    if not filecmp.cmp(file, file_path+'/BACKUP/'+backup_file_latest, shallow=True) :
        backup_now=datetime.datetime.now().strftime('%Y%m%d%H%M%S') # ic| backup_now: '20211201074127'
        backup_flie_name=re.sub('.txt', backup_now+'.txt',file_title_now)
        shutil.copy2(file, file_path+'/BACKUP/'+backup_flie_name)

参考にしたページ

文字列を置換する

note.nkmk.me

# 複数文字で区切ったりするため、正規表現を使用する
import re
(snip)
        # 現在のファイル名から位置情報・色情報・リマインダー・拡張子を取り除いた文字列を取得する。
        # これで同じファイルかどうか判断する。同じファイル名を使うこともあるかもだけど、まぁいいか。
        file_title_only=re.sub('\(\(.+\)\)|<.+>|【\[.+\]】|.txt', '',file_title_now)

複数パターンを置換したい場合は「|」(パイプ)で区切る。

フォルダ内のファイルを条件付きでリスト取得し、更新日が最新のものを取得する

pathlib Pathについて
note.nkmk.me

Path オブジェクトの更新日ソートについて
itpc.blog.fc2.com

# パスをオブジェクトとして操作・処理するライブラリ
from pathlib import Path
(snip)

        # バックアップフォルダ内の同じタイトルファイルをリストで取得する
        backup_file_lists = list(Path(file_path+'/BACKUP').glob(file_title_only+'*.txt'))

        # リストをファイル更新日で降順並び替え
        backup_file_lists.sort(key=os.path.getmtime, reverse=True)
        # リストの最初にいるファイル名=更新が最新のファイル名を取得する
        backup_file_latest=backup_file_lists[0].name #ic| backup_file_latest: 'as((644x188+104+14)).txt'

ファイルの中身を比較して、違ったら複製する

filecmpについて
docs.python.org

# ファイルを比較するライブラリ
import filecmp
# ファイル移動するときのライブラリ
import shutil
(snip)

    # もし現在のファイルと最新バックアップファイルの内容に差があったらバックアップを実施する
    if not filecmp.cmp(file, file_path+'/BACKUP/'+backup_file_latest, shallow=True) :
        backup_now=datetime.datetime.now().strftime('%Y%m%d%H%M%S') # ic| backup_now: '20211201074127'
        backup_flie_name=re.sub('.txt', backup_now+'.txt',file_title_now)
        shutil.copy2(file, file_path+'/BACKUP/'+backup_flie_name)

いつもありがとうございます!