• ftp上传与gui button的练习


    #!/usr/bin/python  
    #coding=gbk  
    ''''' 
        ftp自动下载、自动上传脚本,可以递归目录操作 
    ''' 
     
    from ftplib import FTP
    from functools import partial
    import os,sys,string,datetime,time
    import Tkinter
    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 = 10 
                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):
                print '本地文件不存在'
                return 
            if self.is_same_size(localfile, remotefile):  
                debug_print('跳过[相等]: %s' %localfile)  
                return 
            file_handler = open(localfile, 'rb')
            print '打开本地文件'
            print '开始上传:'
            self.ftp.storbinary('STOR %s' %remotefile, file_handler)
            print '上传完毕'
            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()  

    #获取指定文件夹下所有文件及文件夹
    def listdir(dir_path):
        if os.path.exists(dir_path):
            return os.listdir(dir_path)
        else:
            return '目录' + dir_path + '不存在'

    def put_rru():
        hostaddr = '200.51.1.17' # ftp地址  
        username = 'zte' # 用户名  
        password = 'zte' # 密码  
        port  =  21   # 端口号
       
        #获取本地文件的路径,先获取文件名,再与文件夹路径合并
        file_dir_local = 'D:putcpu\rru'
        file_name = listdir(file_dir_local)
        rootdir_local = file_dir_local + '\' + str(file_name[0])
        #rootdir_local = 'D:putcpu\rru\aaa.txt'
        rootdir_remote = './ata/rru/ddd.txt'
       
        f = MYFTP(hostaddr, username, password, rootdir_remote, port)  
        f.login()    
        #ftp上传文件
        f.upload_file(rootdir_local, rootdir_remote)

    def put_cc():
        print 'not yet!'

    if __name__ == '__main__':
       
        root = Tkinter.Tk()
       
        file = open("log.txt", "a")  
        timenow  = datetime.datetime.now()
        #datenow  = time.strftime('%Y-%m-%d, timenow)  
        logstr = "  %s 开始执行备份: " %timenow
        debug_print(logstr)
        # 配置如下变量  
    #    hostaddr = '192.254.1.1' # ftp地址  
    #    username = 'test' # 用户名  
    #    password = 'test' # 密码  
    #    port  =  21   # 端口号    

        #获取本地文件的路径,先获取文件名,再与文件夹路径合并
    #    file_dir_local = 'D:putcpu'
    #    file_name = listdir(file_dir_local)
    #    rootdir_local = file_dir_local + '\' + str(file_name[0])
        #rootdir_local = 'D:putcpu\rru\aaa.txt'
    #    rootdir_remote = './ata/ddd.txt'
       
    #    f = MYFTP(hostaddr, username, password, rootdir_remote, port)  
    #    f.login()    
    #    #ftp上传文件
    #    f.upload_file(rootdir_local, rootdir_remote)

        MyButton = partial(Tkinter.Button, root, fg='white', bg='blue')
        b1 = MyButton(text='put rru!', bg = 'blue', command = put_rru)
        b2 = MyButton(text='put cc!', bg = 'blue', command = put_cc)
        qb = MyButton(text='QUIT', bg='red', command=root.quit)
        b1.pack()
        b2.pack()

        qb.pack(fill=Tkinter.X, expand=True)
        root.title('putcpu!')
        root.mainloop()
       
        timenow  = datetime.datetime.now()
        #datenow  = time.strftime('%Y-%m-%d', timenow)  
        logstr = "  %s 成功执行了备份 " %timenow  
        debug_print(logstr)  
          
        file.write(logstr)  
        file.close()

  • 相关阅读:
    Java学习图形界面+网络编程案例---------网络简易通讯
    Java图形界面学习---------简易登录界面
    Python-Collections模块之Counter
    Python-面试题-字符串(str)
    Python-面试题-数学运算(math)
    Python-面试题-列表(list)
    python-数据类型-字符串(Str)
    Pytest框架实现一些前后置(固件、夹具)的处理
    Pytest框架运行方式(主函数、命令行、配置、执行顺序)
    Jenkins配置maven+Allure
  • 原文地址:https://www.cnblogs.com/foreverlzj/p/4365670.html
Copyright © 2020-2023  润新知