王锋 2012年07月06日 星期五 15:19 | 2341次浏览 | 0条评论
python ftp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 | #!/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() |
Zeuux © 2025
京ICP备05028076号
暂时没有评论