3

2時間以上経過したファイルをsftp経由でダウンロードしたいのですが。次に、それらをネットワークサイトから削除したいと思います。sftpには次のコードを使用できますが、リモートマシンでオブジェクトを処理すると問題が発生します。以下のコードは「timestamp=os.stat」行で失敗します。これはosモジュールの問題だと思いますか?

import paramiko, sys, os,time

host = 'ftp address'
port = 22
transport = paramiko.Transport((host, port))
password = "pass"                   #hard-coded
username = "user"                   #hard-coded
transport.connect(username = username, password = password)


sftp = paramiko.SFTPClient.from_transport(transport)
print 'SFTP Client initiated'

remotepath = "/remote folder/"
localpath = '/local folder/' 

for file in sftp.listdir('.'):
    fullpath   = os.path.join('.',file) 
    timestamp  = os.stat(fullpath).st_ctime # get timestamp of file
    createtime = datetime.datetime.fromtimestamp(timestamp)
    now = datetime.datetime.now()
    delta = now -createtime
    if delta.hours > 2:
        sftp.get(file,localpath) 
        sftp.remove(file)

sftp.close()
transport.close()   
4

2 に答える 2

2

OPによる自己受容型の回答はほとんど機能しますが、ファイルごとにサーバーへのラウンドトリップが必要になるため、非常に非効率的です。実際には、コードにはすでに必要なデータがすべて含まれていますが、直接pysftp.Connection.listdir使用するのではなく、ラッパーを使用してデータを破棄するだけです。pysftp.Connection.listdir_attr

for entry in sftp.listdir_attr(remotepath):
    timestamp = entry.st_mtime
    createtime = datetime.datetime.fromtimestamp(timestamp)
    now = datetime.datetime.now()
    delta = now - createtime
    if delta.hours > 2:
        filepath = remotepath + '/' + entry.filename
        sftp.get(filepath, os.path.join(localpath, entry.filename)) 
        sftp.remove(filepath)

Connection.listdirと同じデータを内部的に取得しますConnection.listdir_attr。彼らは両方とも最終的にParamikoと呼びますSFTPClient.listdir_attr。ただしConnection.listdir、ファイル名のみを返し、他のすべてのファイル属性を破棄します。Paramikoを介してディレクトリ内のすべてのSFTPファイルのサイズをフェッチする方法も参照してください。

pysftpは死んでいるようですが。代わりに、Paramikoを直接使用することを検討してください。APIはほとんど同じなので、上記のコードはそのまま動作します。pysftpとParamikoも参照してください。


また、os.path.joinSFTPパスでは使用しないでください。SFTPは常にスラッシュをos.path.join使用しますが、ローカルパス構文を使用するため、Windowsではバックスラッシュを使用し、コードは失敗します。

また、のターゲットパスにpysftp.Connection.getは、パスだけでなくファイル名も必要です(ここでos.path.joinは使用する必要があります)

于 2019-05-24T08:36:02.600 に答える
1

リモートマシン上のファイルのタイムスタンプを取得し、それを現在と比較するために必要なビットは以下のとおりです。非プログラマー(私)によって一緒にハッキングされましたが、それは機能します。

timestamp  = sftp.stat(fullpath).st_atime  # get timestamp of file in epoch seconds
createtime = datetime.datetime.now()
now        = time.mktime(createtime.timetuple())
datetime.timedelta = now - timestamp

if datetime.timedelta> x:
    do something
于 2012-09-20T12:07:19.647 に答える