為什麼要用Python指令碼下載以及基本介紹
經常會有人需要從遠端伺服器下載一些檔案資源,下載個別小檔案可以直接用sz等命令,但是,需要下載一個資料夾呢?sz就不行了,這時候當然可以先壓縮資料夾,然後下載,這樣也是可以的,只要檔案不是很大,那麼,有沒有其他辦法下載資料夾呢?辦法當然是有的,就是寫Python指令碼,然後通過paramiko模組就可以從遠端傳輸下載資料夾到本地了,是不是很方便呢……
paramiko模組提供了ssh及sftp進行遠端登入伺服器執行命令和上傳下載檔案的功能。這是一個第三方的軟體包,使用之前需要先進行安裝,我們這裡主要利用sftp進行下載傳輸檔案
就像下圖中的執行,可以一個一個的迴圈下載檔案 !
使用時候的基本配置
下面的這些資訊需要自己配置一下,即初始化一些引數,包括伺服器資訊以及遠端檔案和本地檔案的存放路徑配置
# 伺服器連線資訊
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完成檔案傳輸操作。大家有什麼疑問或者想法,可以留言或者聯絡我。