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

Python SFTP下载早于x的文件并删除网络存储,python,sftp,paramiko,Python,Sftp,Paramiko,我想通过sftp下载一些超过2小时的文件。然后我想把它们从网站上删除。我可以为sftp使用以下代码,但在远程机器上处理对象会给我带来问题。下面的代码在“timestamp=os.stat”行失败,我认为这是操作系统模块的问题 import paramiko, sys, os,time host = 'ftp address' port = 22 transport = paramiko.Transport((host, port)) password = "pass"

我想通过sftp下载一些超过2小时的文件。然后我想把它们从网站上删除。我可以为sftp使用以下代码,但在远程机器上处理对象会给我带来问题。下面的代码在“timestamp=os.stat”行失败,我认为这是操作系统模块的问题

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()   

在远程机器上获取文件的时间戳,然后将其与现在进行比较所需的位如下。由非程序员(me)共同破解,但它可以工作

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

虽然OP自我接受的答案几乎有效,但它的效率相当低,因为它涉及到每个文件到服务器的往返。虽然实际上代码已经有了所有需要的数据,但它只是使用包装器而不是直接使用

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\u attr
相同的数据。它们最终都调用Paramiko。但是
Connection.listdir
只返回文件名,丢弃所有其他文件属性。另请参阅


此外,不应该在SFTP路径上使用
os.path.join
。SFTP始终使用正向斜杠,而
os.path.join
使用本地路径语法,因此


pysftp.Connection.get
的目标路径也需要文件名,而不仅仅是路径(这里应该使用
os.path.join

查看“删除”和文件“状态”操作的文档。你能就操作系统模块的问题提供建议吗?+1用于完成这项工作,而不仅仅是帮助吸血鬼。操作系统模块严格在本地机器上运行,不知道远程机器上的工作方式,因此你应该能够通过listdir查看你有哪些本地文件y、 但是要从远程获取列表,您必须返回到这些文档,并找到一个操作将其拖回并比较它们;或者只是尝试删除远程文件,忽略任何表示它不存在的错误。谢谢John的建议。我可以使用paramiko的一些功能(例如,listdir)显示远程计算机上的文件,但不确定如何处理远程对象,因为paramiko文档中没有涉及到这一点。上述代码现在在时间戳行上失败。您能否提供有关远程计算机模块的建议?
dir()
检查。获取成员
空闲
pdb
或可靠的旧
打印
都是查看内部对象的好方法。