1. 程式人生 > 程式設計 >python實現從ftp上下載檔案的例項方法

python實現從ftp上下載檔案的例項方法

python從ftp上下載檔案的方法:

首先匯入ftp模組;

然後使用【chdir】命令切換工作路徑;

再使用“self.ftp.nlst()”命令獲取目錄下的檔案;

最後使用“self.ftp.retrbinary()”命令下載ftp檔案即可。

#!/usr/bin/python
# coding=utf-8
import os
from ftplib import FTP # 引入ftp模組
class MyFtp:
  ftp = FTP()  
  def __init__(self,host,port=21):
    self.ftp.connect(host,port)  
  def login(self,username,pwd):
    self.ftp.set_debuglevel(2) # 開啟除錯級別2,顯示詳細資訊    
    self.ftp.login(username,pwd)    
    p
rint(self.ftp.welcome)  
  def downloadFile(self,localpath,remotepath,filename):
    os.chdir(localpath)  # 切換工作路徑到下載目錄
    self.ftp.cwd( remotepath)  # 要登入的ftp目錄
    self.ftp.nlst() # 獲取目錄下的檔案
    file_handle = open(filename,"wb").write  # 以寫模式在本地開啟檔案
    self.ftp.retrbinary('RETR %s' % os.path.basename(filename),file_handle,blocksize=1024) # 下載ftp檔案
    # ftp.delete(filename) # 刪除ftp伺服器上的檔案
  def close(self):
    self.ftp.set_debuglevel(0) # 關閉除錯    
    self.ftp.quit()if __name__ == '__main__':
  ftp = MyFtp('host')
  ftp.login('username','pwd')
  ftp.downloadFile('E:\\RED\\workspace\\appAuto\\apk\\Android10','/mobile/Android/release10/','xxx.apk')
  ftp.close()

例項擴充套件:

#coding=utf-8
'''
 ftp自動下載、自動上傳指令碼,可以遞迴目錄操作
'''

from ftplib import FTP
import os,sys,string,datetime,time
import socket

class MYFTP:
 def __init__(self,hostaddr,password,remotedir,port=21):
 self.hostaddr = hostaddr
 self.username = username
 self.password = password
 self.remotedir = remotedir
 self.port = port
 self.ftp = FTP()
 self.file_list = []
 # self.ftp.set_debuglevel(2)
 def __del__(self):
 self.ftp.close()
 # self.ftp.set_debuglevel(0)
 def login(self):
 ftp = self.ftp
 try: 
 timeout = 300
 socket.setdefaulttimeout(timeout)
 ftp.set_pasv(True)
 print u'開始連線到 %s' %(self.hostaddr)
 ftp.connect(self.hostaddr,self.port)
 print u'成功連線到 %s' %(self.hostaddr)
 print u'開始登入到 %s' %(self.hostaddr)
 ftp.login(self.username,self.password)
 print u'成功登入到 %s' %(self.hostaddr)
 debug_print(ftp.getwelcome())
 except Exception:
 print u'連線或登入失敗'
 try:
 ftp.cwd(self.remotedir)
 except(Exception):
 print u'切換目錄失敗'

 def is_same_size(self,localfile,remotefile):
 try:
 remotefile_size = self.ftp.size(remotefile)
 except:
 remotefile_size = -1
 try:
 localfile_size = os.path.getsize(localfile)
 except:
 localfile_size = -1
 debug_print('localfile_size:%d remotefile_size:%d' %(localfile_size,remotefile_size),)
 if remotefile_size == localfile_size:
 return 1
 else:
 return 0
 def download_file(self,remotefile):
 if self.is_same_size(localfile,remotefile):
 debug_print(u'%s 檔案大小相同,無需下載' %localfile)
 return
 else:
 debug_print(u'>>>>>>>>>>>>下載檔案 %s ... ...' %localfile)
 #return
 file_handler = open(localfile,'wb')
 self.ftp.retrbinary(u'RETR %s'%(remotefile),file_handler.write)
 file_handler.close()

 def download_files(self,localdir='./',remotedir='./'):
 try:
 self.ftp.cwd(remotedir)
 except:
 debug_print(u'目錄%s不存在,繼續...' %remotedir)
 return
 if not os.path.isdir(localdir):
 os.makedirs(localdir)
 debug_print(u'切換至目錄 %s' %self.ftp.pwd())
 self.file_list = []
 self.ftp.dir(self.get_file_list)
 remotenames = self.file_list
 #print(remotenames)
 #return
 for item in remotenames:
 filetype = item[0]
 filename = item[1]
 local = os.path.join(localdir,filename)
 if filetype == 'd':
 self.download_files(local,filename)
 elif filetype == '-':
 self.download_file(local,filename)
 self.ftp.cwd('..')
 debug_print(u'返回上層目錄 %s' %self.ftp.pwd())
 def upload_file(self,remotefile):
 if not os.path.isfile(localfile):
 return
 if self.is_same_size(localfile,remotefile):
 debug_print(u'跳過[相等]: %s' %localfile)
 return
 file_handler = open(localfile,'rb')
 self.ftp.storbinary('STOR %s' %remotefile,file_handler)
 file_handler.close()
 debug_print(u'已傳送: %s' %localfile)
 def upload_files(self,remotedir = './'):
 if not os.path.isdir(localdir):
 return
 localnames = os.listdir(localdir)
 self.ftp.cwd(remotedir)
 for item in localnames:
 src = os.path.join(localdir,item)
 if os.path.isdir(src):
 try:
 self.ftp.mkd(item)
 except:
 debug_print(u'目錄已存在 %s' %item)
 self.upload_files(src,item)
 else:
 self.upload_file(src,item)
 self.ftp.cwd('..')

 def get_file_list(self,line):
 ret_arr = []
 file_arr = self.get_filename(line)
 if file_arr[1] not in ['.','..']:
 self.file_list.append(file_arr)
 
 def get_filename(self,line):
 pos = line.rfind(':')
 while(line[pos] != ' '):
 pos += 1
 while(line[pos] == ' '):
 pos += 1
 file_arr = [line[0],line[pos:]]
 return file_arr
def debug_print(s):
 print s

if __name__ == '__main__':
 timenow = time.localtime()
 datenow = time.strftime('%Y-%m-%d',timenow)
 # 配置如下變數
 hostaddr = '211.15.113.45' # ftp地址
 username = 'UserName' # 使用者名稱
 password = '123456' # 密碼
 port = 21 # 埠號 
 rootdir_local = 'E:/mypiv' # 本地目錄
 rootdir_remote = '/PIV'  # 遠端目錄
 
 f = MYFTP(hostaddr,rootdir_remote,port)
 f.login()
 f.download_files(rootdir_local,rootdir_remote)
 
 timenow = time.localtime()
 datenow = time.strftime('%Y-%m-%d',timenow)
 logstr = u"%s 成功執行了備份n" %datenow
 debug_print(logstr)

到此這篇關於python實現從ftp上下載檔案的例項方法的文章就介紹到這了,更多相關python怎麼實現從ftp上下載檔案內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!