1. 程式人生 > 程式設計 >Python 使用SFTP和FTP實現對伺服器的檔案下載功能

Python 使用SFTP和FTP實現對伺服器的檔案下載功能

一、用 ftplib 模組連線遠端伺服器

ftplib模組常用方法

ftp登陸連線
from ftplib import FTP  #載入ftp模組
ftp=FTP()    #設定變數
ftp.set_debuglevel(2)  #開啟除錯級別2,顯示詳細資訊
ftp.connect("IP","port")  #連線的ftp sever和埠
ftp.login("user","password") #連線的使用者名稱,密碼
print ftp.getwelcome()  #打印出歡迎資訊
ftp.cmd("xxx/xxx")  #進入遠端目錄
bufsize=1024   #設定的緩衝區大小
filename="filename.txt"  #需要下載的檔案
file_handle=open(filename,"wb").write #以寫模式在本地開啟檔案
ftp.retrbinaly("RETR filename.txt",file_handle,bufsize) #接收伺服器上檔案並寫入本地檔案
ftp.set_debuglevel(0)  #關閉除錯模式
ftp.quit()   #退出ftp
 
ftp相關命令操作
ftp.cwd(pathname)   #設定FTP當前操作的路徑
ftp.dir()    #顯示目錄下所有目錄資訊
ftp.nlst()   #獲取目錄下的檔案
ftp.mkd(pathname)   #新建遠端目錄
ftp.pwd()    #返回當前所在位置
ftp.rmd(dirname)   #刪除遠端目錄
ftp.delete(filename)  #刪除遠端檔案
ftp.rename(fromname,toname)#將fromname修改名稱為toname。
ftp.storbinaly("STOR filename.txt",file_handel,bufsize) #上傳目標檔案
ftp.retrbinary("RETR filename.txt",bufsize) #下載FTP檔案

ftplib模組封裝呼叫

from ftplib import FTP
from common.logModule import LogClass


class FTPClass(LogClass):
 """
 :FTP連線遠端伺服器下載檔案
 """

 def __init__(self,ftp_link,ftp_path=None):
 """
 :連線ftp伺服器
 :param ftp_link: 伺服器ip,使用者名稱,密碼
 :param ftp_path: ftp中的檔案路徑
 """
 LogClass.__init__(self,logName='FTPClass')
 self.ftp = FTP(ftp_link[0]) # 連結FTP
 self.ftp.set_debuglevel(2) # 設定除錯等級
 self.ftp.login(ftp_link[1],ftp_link[2]) # 輸入使用者名稱和密碼
 self.ftp.set_pasv(False) # False:主動模式 True:被動模式
 if ftp_path:
  self.ftp.cwd(ftp_path)

 def download_file(self,like_file_name,save_path,save_name=None):
 """
 :下載檔案並儲存檔案到本地,如果save_name為空則下載所有檔名稱包含like_file_name的所有檔案
 :param like_file_name: 需要下載的檔案
 :param save_path : 檔案儲存路徑
 :param save_name: 檔案儲存名稱
 :return:
 """
 try:
  ftp_files = self.ftp.nlst() # 獲取ftp當前目錄下的所有檔名稱
  if save_name: # 如果檔案儲存名稱存在則只下載單一檔案
  fp = open(save_path + save_name,'wb') # 以寫模式在本地開啟檔案
  self.ftp.retrbinary('RETR ' + 'ftp檔名',fp.write) # 接收伺服器上檔案並寫入本地檔案
  fp.close() # 關閉檔案
  else: # 如果檔案儲存名稱則下載包含like_file_name的所有檔案
  for ftp_file in ftp_files:
   if ftp_file[-5:] == '.GRB2':
   if like_file_name in ftp_file: # 如果檔名稱中包含like_file_name
    fp = open(save_path + ftp_file,'wb') # 以寫模式在本地開啟檔案
    self.ftp.retrbinary('RETR ' + ftp_file,fp.write) # 接收伺服器上檔案並寫入本地檔案
    fp.close() # 關閉檔案
  self.ftp.quit() # 關閉ftp 連線
 except Exception:
  raise
if __name__ == '__main__':
 ftp_link = ['ip','username','password']
 ftp_path = '/data/result/'
 ftp = FTPClass(ftp_link,ftp_path)
 like_file_name = ".GRB2"
 save_path = 'D:\\file\\'
 ftp.download_file(like_file_name,save_path)

用 paramiko 模組連線遠端伺服器

paramiko 模組常用方法

put(self,localpath,remotepath,callback=None,confirm=True)
	引數說明:
		localpath:上傳原始檔的本地路徑
		remotepath:目標路徑
		callback:獲取接收與總傳輸位元組數
		confirm:上傳完畢後是否呼叫stat()方法,以便確認檔案大小
get(self,callback=None)
	引數說明:
		remotepath:需要下載的遠端檔案
		localpath:本地儲存路徑
		callback:同put方法
mkdir:用於建立目錄
remove:刪除目錄
rename:重新命名
stat:獲取檔案資訊
listdir:獲取目錄列表

paramiko模組封裝呼叫

import os
import paramiko
from stat import S_ISDIR
from common.logModule import LogClass
class SFTPClass(LogClass):
 """
 :SFTP連線遠端伺服器下載檔案
 """

 def __init__(self,ftp_path=None,local_path=None):
 """
 連線ftp伺服器
 """
 LogClass.__init__(self,logName='FTPProcess')
 trans = paramiko.Transport((ftp_link[0],22)) # 連線 ftp
 trans.connect(username=ftp_link[1],password=ftp_link[2]) # 輸入使用者名稱和密碼
 self.sftp = paramiko.SFTPClient.from_transport(trans)
 self.ftp_path = ftp_path # 目標路徑
 self.local_path = local_path # 儲存路徑

 def save_all_file_path(self,ftp_path):
 """儲存所有檔案的列表"""
 all_files = list()
 if ftp_path[-1] == '/': # 去掉路徑字串最後的字元'/',如果有的話
  ftp_path = ftp_path[0:-1]
 files = self.sftp.listdir_attr(ftp_path) # 獲取當前指定目錄下的所有目錄及檔案,包含屬性值
 for i in files:
  filename = ftp_path + '/' + i.filename
  if S_ISDIR(i.st_mode): # 如果是目錄,則遞迴處理該目錄,這裡用到了stat庫中的S_ISDIR方法
  all_files.extend(self.save_all_file_path(filename))
  else:
  all_files.append(filename)
 return all_files

 def download_file(self):
 """
 下載檔案並儲存檔案到本地
 """
 try:
  if self.ftp_path and self.local_path:
  all_files = self.save_all_file_path(self.ftp_path) # 儲存所有檔案的列表
  for file in all_files:
   filename = file.split('/')[-1]
   local_filename = os.path.join(self.local_path,filename)
   self.logger.info(u'During file download: %s' % filename)
   self.sftp.get(file,local_filename) # 下載到本地
  else:
  self.logger.error("ftp_path or local_path is null")
  return
 except Exception as e:
  self.logger.error(e)
if __name__ == '__main__':
 ftp_link = ['ip','user','password']
 ftp_path = "/data/"
 local_path = "D:\\file\\"
 f = SFTPClass(ftp_link,local_path=None)
 f.download_file()

到此這篇關於Python 使用SFTP和FTP實現對伺服器的檔案下載功能的文章就介紹到這了,更多相關Python 實現伺服器檔案下載內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!