Python SFTP下载早于x的文件并删除网络存储

时间:2012-09-10 22:52:34

标签: python sftp paramiko

我想通过sftp下载一些比2小时更早的文件。然后我想从网站上删除它们。我可以使用以下代码进行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()   

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

虽然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)

此外,不应在SFTP路径上使用os.path.join。 SFTP始终使用正斜杠,而os.path.join使用本地路径语法,因此on Windows, it would use backslashes and the code will fail

pysftp.Connection.get的目标路径也需要一个文件名,而不仅仅是路径(此处应使用os.path.join