• paramiko 下载文件


    介绍

    经常会有人需要从远程服务器下载一些文件资源,下载个别小文件可以直接用sz等命令,但是,需要下载一个文件夹呢?sz就不行了,这时候当然可以先压缩文件夹,然后下载,这样也是可以的,只要文件不是很大,那么,有没有其他办法下载文件夹呢?办法当然是有的,就是写Python脚本,然后通过paramiko模块就可以从远程传输下载文件夹到本地了,是不是很方便呢……

    paramiko模块提供了ssh及sftp进行远程登录服务器执行命令和上传下载文件的功能。这是一个第三方的软件包,使用之前需要先进行安装,我们这里主要利用sftp进行下载传输文件

    实现源码

    import paramiko
    import os
    from stat import S_ISDIR as isdir
    
    
    def down_from_remote(sftp_obj, remote_dir_name, local_dir_name):
        """远程下载文件"""
        remote_file = sftp_obj.stat(remote_dir_name)
        if isdir(remote_file.st_mode):
            # 文件夹,不能直接下载,需要继续循环
            check_local_dir(local_dir_name)
            print('开始下载文件夹:' + remote_dir_name)
            for remote_file_name in sftp.listdir(remote_dir_name):
                sub_remote = os.path.join(remote_dir_name, remote_file_name)
                sub_remote = sub_remote.replace('\', '/')
                sub_local = os.path.join(local_dir_name, remote_file_name)
                sub_local = sub_local.replace('\', '/')
                down_from_remote(sftp_obj, sub_remote, sub_local)
        else:
            # 文件,直接下载
            print('开始下载文件:' + str(remote_dir_name))
            sftp.get(remote_dir_name, local_dir_name)
    
    
    def check_local_dir(local_dir_name):
        """本地文件夹是否存在,不存在则创建"""
        if not os.path.exists(local_dir_name):
            os.makedirs(local_dir_name)
    
    
    if __name__ == "__main__":
        """程序主入口"""
        # 服务器连接信息
        host_name = '18.44.99.88'
        user_name = 'root'
        password = '************'
        port = 22
        # 远程文件路径(需要绝对路径)
        remote_dir = 'python2.7/site-packages/xenadmin-1.0.dev_r100-py2.7.egg/xenadmin/admin'
        # 本地文件存放路径(绝对路径或者相对路径都可以)
        local_dir = './admin/'
    
        # 连接远程服务器
        t = paramiko.Transport((host_name, port))
        t.connect(username=user_name, password=password)
        sftp = paramiko.SFTPClient.from_transport(t)
    
        # 远程文件开始下载
        down_from_remote(sftp, remote_dir, local_dir)
    
        # 关闭连接
        t.close()
  • 相关阅读:
    《数据结构》C++代码 线性表
    《数据结构》C++代码 Splay
    《数据结构》C++代码 前言
    蓝桥杯- 算法提高 最大乘积
    HDU-1241 Oil Deposits
    一个简单的网站计数器
    编写一个jsp页面,输出九九乘法表。
    Sum It Up
    历届试题 剪格子
    历届试题 分糖果
  • 原文地址:https://www.cnblogs.com/shangwei/p/15176751.html
Copyright © 2020-2023  润新知