pythonista3で、二つのファイルの差分diffを取る

変更点を確認したい

ファイルの編集前にバックアップは取れるようになった。

tkrou.hatenablog.jp

編集したら、バックアップとの差分が取りたくなった。 pythonista3で二つのファイルの差分diffを取得する。

スクリプト作成

いつも探したらやりたいスクリプトは既に作成されていて、「作り直すのも何だし使わせてもらうかー」と複製ばかりの日々だったが、それも今日でサヨナラ! 今回は自分で作る。 本当はちゃんと探したらやっぱりこれもあるんだろうし、作るといってもそれも色んなサイトのコピペなんだけど、じゃあ本当に新しいものなんてもうこの世のどこにもない、全てはみんな盗み盗まれ模造品だらけの中をただウロウロと歩き回ってるだけなんだ。

filediff.py

import appex
import console
import difflib as diff
import sys
import os

# 選択したファイルが入るリスト
filelist=[]

# 共有ボタンで選択したファイルの処理
if appex.is_running_extension():
    # ファイルのパスをリストで取得
    filelist = appex.get_file_paths()

# もし選択したファイルが2つじゃなかったら
if len(filelist) != 2:
    # ダイアログ表示してプログラムを終了する
    console.alert('ファイルを2つ選んで下さい', '', 'ok', hide_cancel_button=True)
    sys.exit()

# ファイルをそれぞれ開く
with open(filelist[0],'r', encoding='utf-8') as f:
    str1 = f.readlines()
    
with open(filelist[1],'r', encoding='utf-8') as f:
    str2 = f.readlines()

# 差分を出力する
for i in diff.unified_diff(str1, str2, fromfile=os.path.basename(filelist[0]), tofile=os.path.basename(filelist[1])):
    print(i, end='')

diff部分は下記サイトを元にさせてもらった。感謝!

[Python]2つのファイルの差分を抽出する https://it-ojisan.tokyo/python-difflib/

スクリプト使用準備

右上スパナ → share → run pythonista script → edit
プラスボタンで作成したスクリプトを選択

使い方

前回作成したファイルバックアップのスクリプトを、バックアップ取ってから変更した。

結果が下記

--- file-copy-20200406150154.py
+++ file-copy.py
@@ -15,11 +15,15 @@
            PATH = os.path.dirname(i)
            if os.path.isfile(i):
                t = NAME.split('.')
-               # shutil.copyfile(i, os.path.join(PATH, t[0] + '-copy.' + t[1]))
-               shutil.copyfile(i, os.path.join(PATH, t[0] + '-' + bk + '.' + t[1]))
+               bkfilename = t[0] + '-' + bk + '.' + t[1]
+               bkfile = os.path.join(PATH, bkfilename)
+               shutil.copyfile(i, bkfile)
+               console.alert('copied! '+bkfilename, '', 'ok', hide_cancel_button=True)
            if os.path.isdir(i):
-               shutil.copytree(i, os.path.join(PATH, NAME + '-' + bk))
-       console.alert('copied!', '', 'ok', hide_cancel_button=True)
+               bkfilename = NAME + '-' + bk
+               bkfile = os.path.join(PATH, bkfilename)
+               shutil.copytree(i, bkfile)
+               console.alert('copied! '+bkfilename, '', 'ok', hide_cancel_button=True)
    else:
        console.alert('Error Occured', 'Please launch from extension', 'ok', hide_cancel_button=True)

結構変えてしまったので、ちょっと見づらいかな。 少しの変更だったらもう少しわかりやすく表示される。

これでばんばんスクリプト作ってくぞ-!