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)するようなロジックも付け足すことができます。
上で紹介したサンプルコードを基に、自由に応用してみてください。