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

3
我希望通过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个回答

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 vs. Paramiko


此外,在SFTP路径上不应使用os.path.join。SFTP始终使用正斜杠,而os.path.join使用本地路径语法,因此在Windows上,它将使用反斜杠,代码将失败
pysftp.Connection.get的目标路径也需要一个文件名,而不仅仅是一个路径(这里应该使用os.path.join)。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接