Python sftp上传文件 速度过慢

原因:服务器在国外
我方:国内
网络问题较大,自己用软件测试(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分钟内可以上传完
原因:文件目录越多,打开这个目录下的文件越慢,底层需要循环遍历,判断这个文件名是否已经存在

在别人服务器执行的是命令,可以直接执行创建命令,不遍历目录

    原文作者:小久IT之路
    原文地址: https://blog.csdn.net/qq_42817166/article/details/114012509
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞