原因:服务器在国外
我方:国内
网络问题较大,自己用软件测试(winscp)同样很慢刚开始文件很少,读取目录速度没有那么慢,时间长了,文件变多
第一版代码
class SftpInfo(object):
def __init__(self, username, password, timeout=3000):
self.username = username
self.password = password
self.timeout = timeout
# transport和chanel
self.t = ''
self.chan = ''
# 链接失败的重试次数
self.try_times = 10
# 调用该方法连接远程主机
def connect(self):
while True:
# 连接过程中可能会抛出异常,比如网络不通、链接超时
try:
self.t = paramiko.Transport(sock=('xxxxxxxxxxx', 22))
print(self.username)
print(self.password)
self.t.connect(username=self.username, password=self.password)
# 如果没有抛出异常说明连接成功,直接返回
print(u'连接%s成功')
return
# 这里不对可能的异常如socket.error, socket.timeout细化,直接一网打尽
except Exception as e1:
if self.try_times != 0:
print(u'连接%s失败,进行重试')
self.try_times -= 1
else:
print(u'重试10次失败,结束程序')
exit(1)
def sftp_upload_file(self, remote_dir, file, filename):
# 去掉路径字符穿最后的字符'/',如果有的话
remote_filename = remote_dir + '/' + filename
sftp = paramiko.SFTPClient.from_transport(self.t)
is_existence = True if filename in sftp.listdir(f'{remote_dir}/') else False
if not is_existence:
sftp.putfo(fl=file, remotepath=remote_filename)
return True
def sftp_download_file(self, remote_file_name, file_name):
sftp = paramiko.SFTPClient.from_transport(self.t)
# is_existence = True if file_name in sftp.listdir(f'{remote_file_name}/') else False
# if is_existence:
sftp.get(remote_file_name, file_name) # 远程路径 本地路径
def sftp_mkdir_dir(self, dir_name, purchase_currency_code):
sftp = paramiko.SFTPClient.from_transport(self.t)
is_existence = True if dir_name in sftp.listdir('T/') else False # 哦按段
if not is_existence:
sftp.mkdir(path=f'/{dir_name}')
return f'T/{dir_name}'
# 断开连接
def close(self):
self.t.close()
print('stfp--------------------->断开连接')
我这里使用的是 sftp.putfo 我这边是数据流可以更换自己想要的哈
时间测试在5分钟内可以上传完
第二版
修改这个方法
def sftp_mkdir_dir(self, dir_name, purchase_currency_code):
sftp = paramiko.SFTPClient.from_transport(self.t)
# is_existence = True if dir_name in sftp.listdir('T/') else False # 哦按段
# if not is_existence:
try:
sftp.mkdir(path=f'/{dir_name}')
except Exception as e:
# 如果存在了会报错已经存在 这个错误pass处理掉
print(e)
return f'T/{dir_name}'
时间测试在1分钟内可以上传完
原因:文件目录越多,打开这个目录下的文件越慢,底层需要循环遍历,判断这个文件名是否已经存在
在别人服务器执行的是命令,可以直接执行创建命令,不遍历目录