^_^

2009年8月26日星期三

Python FTP 例子

#!/usr/bin/env python.exe
#coding=gbk

from ftplib import FTP
from os.path import basename, dirname, exists
from os import stat, rename, remove
from time import localtime, strftime
from sys import argv


TIMEFORMAT = '%Y%m%d%H%M%S'
TIMESTRING = strftime( TIMEFORMAT, localtime() )


#字符串格式:传输类型|传输模式|主机用户|主机密码|主机IP|本地文件|替换的远程文件
#传输类型:  U上传   D下载
#传输模式:  I二进制模式  A ascii模式
#~ ftpString0 = 'U|A|ocs|ocs321|172.31.1.142|/cygdrive/z/OcsFileRateEngine.cpp|/ztesoft/ocs/zdl/OcsFileRateEngine.cpp'
#~ ftpString1 = 'U|I|ocs|ocs321|172.31.1.142|/cygdrive/z/OcsFileRateEngine.cpp|/ztesoft/ocs/zdl/OcsFileRateEngine.cpp'
#~ ftpString2 = 'D|A|ocs|ocs321|172.31.1.142|/cygdrive/z/conn.pl|/ztesoft/ocs/zdl/conn.pl'
#~ ftpString3 = 'D|I|ocs|ocs321|172.31.1.142|/cygdrive/z/conn.pl|/ztesoft/ocs/zdl/conn.pl'

def UpdateFile(filestr):
    ''
    list = filestr.split('|')
    transferType = list[0]
    transferMod = list[1]
    r_user = list[2]
    r_passwd = list[3]
    r_ip = list[4]
    localFile = list[5]
    roamFile = list[6]
    l_fileName = basename(localFile)
    l_filePath = dirname(localFile)
    r_fileName = basename(roamFile)
    r_filePath = dirname(roamFile)
    
    isBackFile = 0
    
    print '###########################################################'
    print '开始连接主机:',r_ip
    print '登录用户:    ',r_user
    if (transferType=='U'):
        print '上传文件:    \n\t\t',localFile
        print '上传文件大小:',stat(localFile).st_size,'byte'
    if (transferType=='D'):
        myFtp.sendcmd('TYPE I')
        print '下载文件:    \n\t\t',roamFile
        print '下载文件大小:',myFtp.size(roamFile),'byte'
    
    
    myFtp = FTP(r_ip)
    myFtp.login(r_user, r_passwd)
    print '当前远程路径:',myFtp.pwd()
    myFtp.cwd(r_filePath)
    print '变更路径到:  ',myFtp.pwd()
    
    myFtp.set_debuglevel(0)
    if (transferType == 'U'):#上传流程
        #判断目录下文件是否存在
        #上传流程判断远程目录下相应文件是否存在
        #~ print '上传流程判断远程目录下相应文件是否存在'
        fileNameList = []
        fileNameList = myFtp.nlst()
        for file in fileNameList:
            if (file == r_fileName):
                bakFileName = roamFile + TIMESTRING
                print '远程FTP服务器存在重名文件,将其改名为:\n\t',bakFileName
                myFtp.rename(roamFile, bakFileName)
                isBackFile=1
        
        if (transferMod == 'I'):#二进制模式
            print 'localfile:',localFile
            fileHeadle = open(localFile, 'rb')
            myFtp.storbinary('STOR ' + r_fileName, fileHeadle)
            fileHeadle.close()
        elif (transferMod == 'A'):#ascii模式
            fileHeadle = open(localFile, 'r')
            myFtp.storlines('STOR ' + r_fileName, fileHeadle)
            fileHeadle.close()
        else:
            print '未知的模式类型:',transferMod
        
    elif (transferType == 'D'):#下载流程
        #判断目录下文件是否存在
        #下载流程判断本地目录下文件是否已经存在
        #~ print '下载流程判断本地目录下文件是否已经存在'
        if exists(localFile):
            bakFileName = localFile + TIMESTRING
            print '本地存在重复文件,将其改名为:',bakFileName
            rename(localFile, bakFileName)
            isBackFile=1
        
        #开始下载
        if (transferMod == 'I'):#二进制模式
            fileHeadle = open(localFile, 'wb')
            myFtp.retrbinary('RETR ' + r_fileName, fileHeadle.write)
            fileHeadle.close()
        elif (transferMod == 'A'):#ascii模式
            fileHeadle = open(localFile, 'w')
            myFtp.retrlines('RETR ' + r_fileName, lambda s, w=fileHeadle.write: w(s+"\n"))
            fileHeadle.close()
        else:
            print '未知的模式类型:',transferMod
    else:
        print '未知的传输类型:',transferType
    myFtp.set_debuglevel(0)
    
    myFtp.sendcmd('TYPE I')
    if (transferType=='U'):
        print '上传文件:\n\t\t%s [%d] byte ' % (roamFile, myFtp.size(roamFile))
    if (transferType=='D'):
        print '下载文件:\n\t\t%s [%d] byte ' % (localFile, stat(localFile).st_size)
        
    isOK = (stat(localFile).st_size == myFtp.size(roamFile))
    if (isOK == False):
        print '本地文件大小:[%d] byte' % stat(localFile).st_size
        print '远程文件大小:[%d] byte' % myFtp.size(roamFile)
    
    if ( isOK == False and transferType=='U'):
        print '!=============文件上传大小不一致,进行回退=================!'
        #删除远程服务器刚上传的文件
        myFtp.delete(roamFile)
        #回退备份文件
        if (isBackFile == 1):
            myFtp.rename(bakFileName, roamFile)
        
    if ( isOK == False and transferType=='D'):
        print '!=============文件下载大小不一致,进行回退=================!'
        #删除刚下载文件
        remove(localFile)
        #回退备份文件
        if (isBackFile == 1):
            rename(bakFileName, localFile)
    
    if ( isOK == False ):
        print '!======================回退完成===========================!'
        
    print '###########################################################'
    
    myFtp.quit()

#从文件中读取更新文件字符串
updateFileListName = argv[1]

UpdateFD = open(updateFileListName, 'r')

for str in UpdateFD:
    if (str[0] != '#'): UpdateFile(str)

UpdateFD.close()
本站文章除注明外,均为本站原创
转载请注明文章转载自: 大笨熊乐园 [ https://blog.foolbear.com/ ]
文章标题: Python FTP 例子
文章地址: https://blog.foolbear.com/2009/08/python-ftp_26.html

没有评论 :

发表评论

Related Posts with Thumbnails