Python通過paramiko從遠處伺服器下載檔案資源到本地

gxcuizy發表於2018-08-02

為什麼要用Python指令碼下載以及基本介紹

經常會有人需要從遠端伺服器下載一些檔案資源,下載個別小檔案可以直接用sz等命令,但是,需要下載一個資料夾呢?sz就不行了,這時候當然可以先壓縮資料夾,然後下載,這樣也是可以的,只要檔案不是很大,那麼,有沒有其他辦法下載資料夾呢?辦法當然是有的,就是寫Python指令碼,然後通過paramiko模組就可以從遠端傳輸下載資料夾到本地了,是不是很方便呢……  

paramiko模組提供了ssh及sftp進行遠端登入伺服器執行命令和上傳下載檔案的功能。這是一個第三方的軟體包,使用之前需要先進行安裝,我們這裡主要利用sftp進行下載傳輸檔案 

就像下圖中的執行,可以一個一個的迴圈下載檔案 !

Python通過paramiko從遠處伺服器下載檔案資源到本地

 使用時候的基本配置

下面的這些資訊需要自己配置一下,即初始化一些引數,包括伺服器資訊以及遠端檔案和本地檔案的存放路徑配置

# 伺服器連線資訊
host_name = '127.0.0.1'
user_name = 'root'
password = 'root'
port = 22
# 遠端檔案路徑(需要絕對路徑)
remote_dir = '/data/nfs/zdlh/pdf/2018/07/31'
# 本地檔案存放路徑(絕對路徑或者相對路徑都可以)
local_dir = 'file_download/'複製程式碼

實現原始碼 

#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
通過paramiko從遠處伺服器下載檔案資源到本地
author: gxcuizy
time: 2018-08-01
"""

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('開始下載檔案:' + 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 = '127.0.0.1'
    user_name = 'root'
    password = 'root'
    port = 22
    # 遠端檔案路徑(需要絕對路徑)
    remote_dir = '/data/nfs/zdlh/pdf/2018/07/31'
    # 本地檔案存放路徑(絕對路徑或者相對路徑都可以)
    local_dir = 'file_download/'

    # 連線遠端伺服器
    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()
複製程式碼

 結束語

在Python中,可以很好地利用Parmmiko的sftp完成檔案傳輸操作。大家有什麼疑問或者想法,可以留言或者聯絡我。

相關文章