Python_实现ftp上传和下载

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

你可能感兴趣的:(Python_实现ftp上传和下载)