亚洲欧美日韩综合系列在线_91精品人妻一区二区_欧美大肥婆一级特大AA片_九色91视频免费观看_亚洲综合国产精品_av中文字幕在线不卡_久久精品色综合网_看黄色视频的软件_无卡无码高清中文字幕码2024_亚洲欧美日韩天堂网

Python_實現(xiàn)ftp上傳和下載

來源:menglei8625 發(fā)布時間:2018-11-03 16:12:27 閱讀量:1068

  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不存在,繼續(xù)...' %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 發(fā)生錯誤: %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 = './'          # 遠(yuǎn)程目錄  
  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 成功執(zhí)行了備份\n" %datenow
  164. 164.    debug_print(logstr)
  165. 165.      
  166. 166.    file.write(logstr)
  167. 167.    file.close()

標(biāo)簽: 服務(wù)器搭建
分享:
評論:
你還沒有登錄,請先