python下操作ftp上传

生产情况:tomcat下业务log备份,目录分多级,然后对应目录格式放到ftp上;所以,结构上 我就是一级一级目录进行判断(因为我没有找到在ftp一次判断其子目录是否存在),还有一个low点就是我没有找到怎样一次性的调用ftp的login因为现在每次判断都需要登录一下,最终功能是实现了;想着先贴出来

#!/usr/local/bin/python3.5
###Description: 上传业务log到NFS199
###Author: Danny.Deng
###DateTime: 2016-11-25
import os,sys,shutil,time,datetime,re,socket,subprocess,ftplib
##########################
backup_dir = "/dockerlogs/"
###############ip地址依赖hosts文件中的hostname解析
ip_addr = socket.gethostbyname(socket.gethostname())
ports = sorted(os.listdir(backup_dir))
yesterday = (datetime.datetime.now() - datetime.timedelta(days=1)).strftime("%Y%m%d")
thirday = (datetime.datetime.now() - datetime.timedelta(days=2)).strftime("%Y%m%d")
yearday = (datetime.datetime.now() - datetime.timedelta(days=365)).strftime("%Y%m%d")
###############取log文件
pattern = re.compile(r'' + thirday + '*.log$' )
year_pattern = re.compile(r'' + yearday + '*.log$' )
#pattern = re.compile(r'' + thirday + '*.log' )
###############取服务端口列表目录
for port in (ports):
    port_dir = backup_dir + port
    ftp_dir = ip_addr + "/" + port
##############判断ftp上是否有对应目录,没有则创建,此次判断是两个目录 如:192.168.20.130/8000 这两级是否存在
    ftp = ftplib.FTP("192.168.xxxxx")
    ftp.login("syxxx","xxxx",10)
    try:
        ftp.mkd(ip_addr)
        ftp.cwd(ip_addr)
        try:
            ftp.mkd(port)
            ftp.quit()
        except ftplib.error_perm:
            ftp.quit()
    except ftplib.error_perm:
        ftp.cwd(ip_addr)
        try:
            ftp.mkd(port)
            ftp.quit()
        except ftplib.error_perm:
            ftp.quit()
##############取端口目录下的service目录
    for services in sorted(os.listdir(port_dir)):
        services_dir = port_dir + "/" + services
##############判断services目录是否存在,即第三级 如:192.168.20.130/8000/yunwei
        ftp = ftplib.FTP("19xxxxx")
        ftp.login("sxxx","sxxxxx",10)
        try:
            ftp.cwd(ftp_dir)
        except ftplib.error_perm:
            pass
        try:
            ftp.mkd(services)
        except ftplib.error_perm:
            ftp.quit()
#############遍历service目录中的符合的文件
        for file in sorted(os.listdir(services_dir)):
            match = pattern.search(file)
            y_match = year_pattern.search(file)
            if match:
#############匹配到文件后进行 文件名 更换操作,方便上传
                ftpdir_service = ftp_dir + "/" + services
#############登录到ftp上的对应目录,准备上传
                ftp = ftplib.FTP("xxxxx")
                ftp.login("xxxxx","xxxxxx",10)
                try:
                    ftp.cwd(ftpdir_service)
                except ftplib.error_perm:
                    pass
                filename = services_dir + "/" + file
                file_gz = file + ".gz"
#############上传压缩文件到ftp
                os.environ['filename'] = str(filename)
                os.system('gzip $filename')
                filename_gz = filename +  ".gz"
#############只读模式打开本地需要上传的文件
                filename_put = open(filename_gz,'rb')
                ftp.storbinary('STOR %s' % os.path.basename(filename_gz),filename_put)
                os.remove(filename_gz)
#############替换文件日期,即取出一年前的文件格式进行后续的ftp.delete
                year_filename = filename_gz.replace(thirday,yearday)
#############错误处理,如果文件不存在时  pass
                #ftp.dir(file_gz)
                try:
                    ftp.delete(year_filename)
                except ftplib.error_perm:
                    pass

 

  

posted @ 2016-11-23 22:28  Tony_Deng  阅读(1200)  评论(0编辑  收藏  举报