#概要
・ローカルファイルをtimestampでsortする。
・ついでに、先日書いたparamiko+scpで共有サーバにファイル転送するとマージしてみる
#経緯
先日、paramiko+scpで共有サーバにファイル転送するでローカルファイルをscpで転送するプログラムを書いたのですが、Pythonの勉強もかねてローカルファイルをtimestampでsortするプログラムを書いたのでこれとマージしてみようと思います。
#やってみた
1.sorted()関数を定義してlambda式を使う
<ソート前>
['test1.txt', 'test10.txt', 'test2.txt', 'test3.txt', 'test4.txt', 'test5.txt', 'test6.txt', 'test7.txt', 'test8.txt', 'test9.txt']
<コード>
import os
localpath = r"C:\test
def sorted_ls(localpath):
mtime = lambda m: os.stat(os.path.join(localpath, m)).st_mtime
return list(sorted(os.listdir(localpath), key=mtime))
print(sorted_ls(localpath))
<ソート後>
['test1.txt', 'test10.txt', 'test2.txt', 'test3.txt', 'test4.txt', 'test5.txt', 'test6.txt', 'test8.txt', 'test9.txt', 'test7.txt']
lambda式の理解は今後するとして、今回はkeyにmtime(最終更新日時)を使ってsortしてみました。
※ctimeでも良いかもですが、mtimeのほうがソースとして多かったのでこちらを採用。
2.マージ
#-*- coding:utf-8 -*-
import paramiko
import scp
import os
localpath = 'localpath'
remotepath = 'remotepath'
def sorted_ls(localpath):
mtime = lambda x: os.stat(os.path.join(localpath, x)).st_mtime
return list(sorted(os.listdir(localpath), key=mtime))
files = sorted_ls(localpath)
with paramiko.SSHClient() as ssh:
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname=hostname, port=22, username=username, password=password)
with scp.SCPClient(ssh.get_transport()) as scp:
for f in files:
scp.put(localpath + f,remotepath)
os.remove(localpath + f)
これで処理は完了です。withをネストすることでsshをログインしたままでscpの処理をループで行うことができます。
#参照文献
・Pythonのリスト(配列)で、文字列の日付(日時)を基準にソートしようとしたときの、備忘録
・ソート HOW TO
・ythonでファイルの一覧を取得して作成日時でソートする方法
・pythonのsorted関数で使われるlambdaとは何なのか