Python_实现ftp上传和下载

来源:menglei8625 发布时间:2018-11-03 16:12:27 阅读量:861

  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[1] not 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()

标签: 服务器搭建
分享:
评论:
你还没有登录,请先