python ftp上传与下载实例代码

发布时间:2019-07-14编辑:脚本学堂
有关python实现ftp上传与下载的代码,ftp自动下载、自动上传脚本,可以递归目录操作,需要的朋友参考下。

例子,python实现ftp上传与下载

代码:
 

复制代码 代码示例:

#!/usr/bin/python    
#coding=gbk    
'''''''  
 ftp自动下载、自动上传脚本,可以递归目录操作  
'''   
    
from ftplib import FTP    
import os,sys,string,datetime,time    
import socket    
   
class MYFTP:    
 def __init__(self, hostaddr, username, 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 = 60   
 socket.setdefaulttimeout(timeout)    
ftp.set_pasv(True)    
 print '开始连接到 %s' %(self.hostaddr)    
ftp.connect(self.hostaddr, self.port)    
     print '成功连接到 %s' %(self.hostaddr)    
print '开始登录到 %s' %(self.hostaddr)    
ftp.login(self.username, self.password)    
print '成功登录到 %s' %(self.hostaddr)    
debug_print(ftp.getwelcome())    
 except Exception:    
     deal_error("连接或登录失败")    
  try:    
ftp.cwd(self.remotedir)    
  except(Exception):    
 deal_error('切换目录失败')    
  
    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('lo:%d  re:%d' %(localfile_size, remotefile_size),)    
if remotefile_size == localfile_size:    
return 1   
  else:    
 return 0   
    def download_file(self, localfile, remotefile):    
 if self.is_same_size(localfile, remotefile):    
     debug_print('%s 文件大小相同,无需下载' %localfile)    
 return   
  else:    
 debug_print('>>>>>>>>>>>>下载文件 %s ... ...' %localfile)    
   #return    
 file_handler = open(localfile, 'wb')    
   self.ftp.retrbinary('RETR %s'%(remotefile), file_handler.write)    
  file_handler.close()    
    
    def download_files(self, localdir='./', remotedir='./'):    
  try:    
 self.ftp.cwd(remotedir)    
  except:    
     debug_print('目录%s不存在,继续...' %remotedir)    
     return   
  if not os.path.isdir(localdir):    
 os.makedirs(localdir)    
   debug_print('切换至目录 %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('返回上层目录 %s' %self.ftp.pwd())    
    def upload_file(self, localfile, remotefile):    
if not os.path.isfile(localfile):    
     return   
 if self.is_same_size(localfile, remotefile):    
   debug_print('跳过[相等]: %s' %localfile)    
return   
  file_handler = open(localfile, 'rb')    
     self.ftp.storbinary('STOR %s' %remotefile, file_handler)    
    file_handler.close()    
    debug_print('已传送: %s' %localfile)    
 def upload_files(self, localdir='./', 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('目录已存在 %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)    
  def deal_error(e):    
  timenow  = time.localtime()    
 datenow  = time.strftime('%Y-%m-%d', timenow)    
  logstr = '%s 发生错误: %s' %(datenow, e)    
  debug_print(logstr)    
file.write(logstr)    
  sys.exit()    
 
   if __name__ == '__main__':    
 file = open("log.txt", "a")    
 timenow  = time.localtime()    
  datenow  = time.strftime('%Y-%m-%d', timenow)    
logstr = datenow    
 # 配置如下变量    
  hostaddr = 'localhost' # ftp地址    
 username = 'test' # 用户名    
  password = 'test' # 密码    
  port  =  21   # 端口号
 rootdir_local  = '.' + os.sep + 'bak/' # 本地目录    
 rootdir_remote = './'    # 远程目录    

 f = MYFTP(hostaddr, username, password, rootdir_remote, port)    
 f.login()    
f.download_files(rootdir_local, rootdir_remote)    

  timenow  = time.localtime()    
 datenow  = time.strftime('%Y-%m-%d', timenow)    
  logstr += " - %s 成功执行了备份n" %datenow    
debug_print(logstr)    
    
file.write(logstr)    
file.close()