Paramikoでサーバー側のファイルの更新日時を取得する:
PythonでParamikoを使ってサーバー側にあるファイルの 更新日時を取得する場合、 SFTPClientオブジェクトのstatメソッドを使います。
statメソッドはファイルの属性を取得するメソッドで、 取得したオブジェクトには複数のプロパティがあり、 その中の「st_mtime」がファイルの更新日時に該当します。 更新日時はタイムスタンプで取得できます。
他にはアクセスタイムを示す「st_atime」や、 「st_size」「st_mode」などがあります。
サーバー側のファイル属性を取得
次のサンプルコードは、 SFTPClientオブジェクトのstatメソッドを使って、 サーバー上のファイル「sample1.txt」の ファイル情報を取得・表示しています。 「# -------------------」で囲まれた部分に注目してください。
import paramiko # SFTP接続準備 config = { "host" : "サーバー名", "port" : ポート番号, "username" : "ユーザー名", "password" : "パスワード" } client = paramiko.SSHClient() client.set_missing_host_key_policy(paramiko.AutoAddPolicy) client.connect(config['host'], port = config['port'], username = config['username'], password = config['password']) # SFTPセッション開始 sftp_con = client.open_sftp() # ----------------------------- # ディレクトリ移動 sftp_con.chdir("web/test") # ファイル情報を取得 attrs = sftp_con.stat("sample1.txt") # プロパティをタプルで表示 for t in attrs.__dict__.items(): print(t) # 更新日時のみを取得 print("タイムスタンプ: ", end="") print(attrs.st_mtime) # ----------------------------- # クローズ client.close()
('_flags', 15) ('st_size', 10) ('st_uid', 118130) ('st_gid', 1000) ('st_mode', 33188) ('st_atime', 1653504762) ('st_mtime', 1652032020) ('attr', {}) タイムスタンプ: 1652032020
attr.st_mtimeで更新日時(タイムスタンプ)を取得しています。
タイムスタンプをdatetime型に変換
タイムスタンプをdatetime型に変換するならdatetimeオブジェクトの fromtimestampメソッドを使います。
import datetime d = datetime.datetime.fromtimestamp(1652032020) print(d)
2022-05-09 02:47:00
ローカル側のファイル属性を取得
ついでにローカル側のファイル属性も取得してみます。
ローカル側ではosモジュールのstatメソッドで取得できます。
次のサンプルコードはカレントディレクトリにある「test.txt」の ファイル属性を取得しています。更新日時は同じく「st_mtime」です。
import os st = os.stat("test.txt") print(st) print(st.st_mtime)
下の1行目が「print(st)」の結果、
2行目が「print(st.st_mtime)」の結果となっています。
os.stat_result(st_mode=33206, st_ino=2533274790400188, st_dev=2230134470, st_nlink=1, st_uid=0, st_gid=0, st_size=14, st_atime=1653535102, st_mtime=1653535102, st_ctime=1653504376) 1653535102.2455182
更新日時を比較する
サーバー側とローカル側の両方のファイルのタイムスタンプが取得できれば、 タイムスタンプを比較して 新しければget(put)するようなロジックも付け足すことができます。
上で紹介したサンプルコードを基に、自由に応用してみてください。