[Python] Python从ftp服务器下载文件的代码 →→→→→进入此内容的聊天室

来自 , 2020-11-18, 写在 Python, 查看 142 次.
URL http://www.code666.cn/view/191f8f85
  1. #coding=utf-8
  2. '''
  3.         ftp自动下载、自动上传脚本,可以递归目录操作
  4. '''
  5.  
  6. from ftplib import FTP
  7. import os,sys,string,datetime,time
  8. import socket
  9.  
  10. class MYFTP:
  11.         def __init__(self, hostaddr, username, password, remotedir, port=21):
  12.                 self.hostaddr = hostaddr
  13.                 self.username = username
  14.                 self.password = password
  15.                 self.remotedir  = remotedir
  16.                 self.port     = port
  17.                 self.ftp      = FTP()
  18.                 self.file_list = []
  19.                 # self.ftp.set_debuglevel(2)
  20.         def __del__(self):
  21.                 self.ftp.close()
  22.                 # self.ftp.set_debuglevel(0)
  23.         def login(self):
  24.                 ftp = self.ftp
  25.                 try:
  26.                         timeout = 300
  27.                         socket.setdefaulttimeout(timeout)
  28.                         ftp.set_pasv(True)
  29.                         print u'开始连接到 %s' %(self.hostaddr)
  30.                         ftp.connect(self.hostaddr, self.port)
  31.                         print u'成功连接到 %s' %(self.hostaddr)
  32.                         print u'开始登录到 %s' %(self.hostaddr)
  33.                         ftp.login(self.username, self.password)
  34.                         print u'成功登录到 %s' %(self.hostaddr)
  35.                         debug_print(ftp.getwelcome())
  36.                 except Exception:
  37.                         print u'连接或登录失败'
  38.                 try:
  39.                         ftp.cwd(self.remotedir)
  40.                 except(Exception):
  41.                         print u'切换目录失败'
  42.  
  43.         def is_same_size(self, localfile, remotefile):
  44.                 try:
  45.                         remotefile_size = self.ftp.size(remotefile)
  46.                 except:
  47.                         remotefile_size = -1
  48.                 try:
  49.                         localfile_size = os.path.getsize(localfile)
  50.                 except:
  51.                         localfile_size = -1
  52.                 debug_print('localfile_size:%d  remotefile_size:%d' %(localfile_size, remotefile_size),)
  53.                 if remotefile_size == localfile_size:
  54.                         return 1
  55.                 else:
  56.                         return 0
  57.         def download_file(self, localfile, remotefile):
  58.                 if self.is_same_size(localfile, remotefile):
  59.                         debug_print(u'%s 文件大小相同,无需下载' %localfile)
  60.                         return
  61.                 else:
  62.                         debug_print(u'>>>>>>>>>>>>下载文件 %s ... ...' %localfile)
  63.                 #return
  64.                 file_handler = open(localfile, 'wb')
  65.                 self.ftp.retrbinary(u'RETR %s'%(remotefile), file_handler.write)
  66.                 file_handler.close()
  67.  
  68.         def download_files(self, localdir='./', remotedir='./'):
  69.                 try:
  70.                         self.ftp.cwd(remotedir)
  71.                 except:
  72.                         debug_print(u'目录%s不存在,继续...' %remotedir)
  73.                         return
  74.                 if not os.path.isdir(localdir):
  75.                         os.makedirs(localdir)
  76.                 debug_print(u'切换至目录 %s' %self.ftp.pwd())
  77.                 self.file_list = []
  78.                 self.ftp.dir(self.get_file_list)
  79.                 remotenames = self.file_list
  80.                 #print(remotenames)
  81.                 #return
  82.                 for item in remotenames:
  83.                         filetype = item[0]
  84.                         filename = item[1]
  85.                         local = os.path.join(localdir, filename)
  86.                         if filetype == 'd':
  87.                                 self.download_files(local, filename)
  88.                         elif filetype == '-':
  89.                                 self.download_file(local, filename)
  90.                 self.ftp.cwd('..')
  91.                 debug_print(u'返回上层目录 %s' %self.ftp.pwd())
  92.         def upload_file(self, localfile, remotefile):
  93.                 if not os.path.isfile(localfile):
  94.                         return
  95.                 if self.is_same_size(localfile, remotefile):
  96.                         debug_print(u'跳过[相等]: %s' %localfile)
  97.                         return
  98.                 file_handler = open(localfile, 'rb')
  99.                 self.ftp.storbinary('STOR %s' %remotefile, file_handler)
  100.                 file_handler.close()
  101.                 debug_print(u'已传送: %s' %localfile)
  102.         def upload_files(self, localdir='./', remotedir = './'):
  103.                 if not os.path.isdir(localdir):
  104.                         return
  105.                 localnames = os.listdir(localdir)
  106.                 self.ftp.cwd(remotedir)
  107.                 for item in localnames:
  108.                         src = os.path.join(localdir, item)
  109.                         if os.path.isdir(src):
  110.                                 try:
  111.                                         self.ftp.mkd(item)
  112.                                 except:
  113.                                         debug_print(u'目录已存在 %s' %item)
  114.                                 self.upload_files(src, item)
  115.                         else:
  116.                                 self.upload_file(src, item)
  117.                 self.ftp.cwd('..')
  118.  
  119.         def get_file_list(self, line):
  120.                 ret_arr = []
  121.                 file_arr = self.get_filename(line)
  122.                 if file_arr[1] not in ['.', '..']:
  123.                         self.file_list.append(file_arr)
  124.                        
  125.         def get_filename(self, line):
  126.                 pos = line.rfind(':')
  127.                 while(line[pos] != ' '):
  128.                         pos += 1
  129.                 while(line[pos] == ' '):
  130.                         pos += 1
  131.                 file_arr = [line[0], line[pos:]]
  132.                 return file_arr
  133. def debug_print(s):
  134.         print s
  135.  
  136. if __name__ == '__main__':
  137.         timenow  = time.localtime()
  138.         datenow  = time.strftime('%Y-%m-%d', timenow)
  139.         # 配置如下变量
  140.         hostaddr = '211.15.113.45' # ftp地址
  141.         username = 'UserName' # 用户名
  142.         password = '123456' # 密码
  143.         port  =  21   # 端口号
  144.         rootdir_local  = 'E:/mypiv' # 本地目录
  145.         rootdir_remote = '/PIV'          # 远程目录
  146.        
  147.         f = MYFTP(hostaddr, username, password, rootdir_remote, port)
  148.         f.login()
  149.         f.download_files(rootdir_local, rootdir_remote)
  150.        
  151.         timenow  = time.localtime()
  152.         datenow  = time.strftime('%Y-%m-%d', timenow)
  153.         logstr = u"%s 成功执行了备份\n" %datenow
  154.         debug_print(logstr)
  155.  
  156. #//python/6353

回复 "Python从ftp服务器下载文件的代码"

这儿你可以回复上面这条便签

captcha