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)するようなロジックも付け足すことができます。

上で紹介したサンプルコードを基に、自由に応用してみてください。

Python