我想通过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()
答案 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
)