python ftp 上傳、下載文件 #獲取昨天日期 TODAY = datetime.date.today() YESTERDAY = TODAY - datetime.timedelta(days=1)CURRENTDAY=YESTERDAY.strftime('%Y%m%d') --------------------------------------------------------------------------------------- #!/usr/bin/env python # -*- coding: cp936 -*- #導(dǎo)入ftplib擴展庫 import ftplib #創(chuàng)建ftp對象實例 ftp = ftplib.FTP() #指定IP地址和端口,連接到FTP服務(wù),上面顯示的是FTP服務(wù)器的Welcome信息 FTPIP= "218.108.***.***" FTPPORT= 21 USERNAME= "ybmftp" USERPWD= "ybm***" ftp.connect(FTPIP,FTPPORT) #通過賬號和密碼登錄FTP服務(wù)器 ftp.login(USERNAME,USERPWD) #如果參數(shù) pasv 為真,打開被動模式傳輸 (PASV MODE) , #否則,如果參數(shù) pasv 為假則關(guān)閉被動傳輸模式。 #在被動模式打開的情況下,數(shù)據(jù)的傳送由客戶機啟動,而不是由服務(wù)器開始。 #這里要根據(jù)不同的服務(wù)器配置 ftp.set_pasv(0) #在FTP連接中切換當前目錄 CURRTPATH= "/home1/ftproot/ybmftp/testupg/payment" ftp.cwd(CURRTPATH) #為準備下載到本地的文件,創(chuàng)建文件對象 DownLocalFilename="YBM_20110629_9001_CHK" f = open(DownLocalFilename,'wb') #從FTP服務(wù)器下載文件到前一步創(chuàng)建的文件對象,其中寫對象為f.write,1024是緩沖區(qū)大小 DownRoteFilename="YBM_20110629_9001_CHK" ftp.retrbinary('RETR ' + DownRoteFilename , f.write ,1024) #關(guān)閉下載到本地的文件 #提醒:雖然Python可以自動關(guān)閉文件,但實踐證明,如果想下載完后立即讀該文件,最好關(guān)閉后重新打開一次 f.close() #關(guān)閉FTP客戶端連接 ftp.close() ###上傳文件 #! /usr/bin/env python from ftplib import FTP import sys, getpass, os.path host="218.108.***.***" username="ybmftp" password="ybm!***" localfile="/home/gws/xym/script/duizhang.txt" remotepath="~/testpayment" f=FTP(host) f.login(username, password) f.cwd(remotepath) fd=open(localfile,'rb')print os.path.basename(localfile) #否則,如果參數(shù) pasv 為假則關(guān)閉被動傳輸模式。 #在被動模式打開的情況下,數(shù)據(jù)的傳送由客戶機啟動,而不是由服務(wù)器開始。 #這里要根據(jù)不同的服務(wù)器配置 ftp.set_pasv(0) f.storbinary('STOR %s ' % os.path.basename(localfile),fd) fd.close() f.quit Python中的ftplib模塊 Python中默認安裝的ftplib模塊定義了FTP類,其中函數(shù)有限,可用來實現(xiàn)簡單的ftp客戶端,用于上傳或下載文件 FTP的工作流程及基本操作可參考協(xié)議RFC959 ftp登陸連接 from ftplib import FTP #加載ftp模塊 ftp=FTP() #設(shè)置變量ftp.set_debuglevel(2) #打開調(diào)試級別2,顯示詳細信息 ftp.connect("IP","port") #連接的ftp sever和端口 ftp.login("user","password")#連接的用戶名,密碼 print ftp.getwelcome() #打印出歡迎信息 ftp.cmd("xxx/xxx") #更改遠程目錄 bufsize=1024 #設(shè)置的緩沖區(qū)大小 filename="filename.txt" #需要下載的文件 file_handle=open(filename,"wb").write #以寫模式在本地打開文件 ftp.retrbinaly("RETR filename.txt",file_handle,bufsize) #接收服務(wù)器上文件并寫入本地文件 ftp.set_debuglevel(0) #關(guān)閉調(diào)試模式ftp.quit #退出ftp ftp相關(guān)命令操作 ftp.cwd(pathname) #設(shè)置FTP當前操作的路徑 ftp.dir() #顯示目錄下文件信息 ftp.nlst() #獲取目錄下的文件 ftp.mkd(pathname) #新建遠程目錄 ftp.pwd() #返回當前所在位置 ftp.rmd(dirname) #刪除遠程目錄 ftp.delete(filename) #刪除遠程文件ftp.rename(fromname, toname)#將fromname修改名稱為toname。 ftp.storbinaly("STOR filename.txt",file_handel,bufsize) #上傳目標文件 ftp.retrbinary("RETR filename.txt",file_handel,bufsize)#下載FTP文件 from ftplib import FTP ftp = FTP() timeout = 30 port = 21 ftp.connect('192.168.1.188',port,timeout) # 連接FTP服務(wù)器 ftp.login('UserName','888888') # 登錄 print ftp.getwelcome() # 獲得歡迎信息 ftp.cwd('file/test') # 設(shè)置FTP路徑 list = ftp.nlst() # 獲得目錄列表 for name in list: print(name) # 打印文件名字 path = 'd:/data/' + name # 文件保存路徑 f = open(path,'wb') # 打開要保存文件 filename = 'RETR ' + name # 保存FTP文件 ftp.retrbinary(filename,f.write) # 保存FTP上的文件 ftp.delete(name) # 刪除FTP文件 ftp.storbinary('STOR '+filename, open(path, 'rb')) # 上傳FTP文件 ftp.quit() # 退出FTP服務(wù)器 import ftplib import os import socket HOST = 'ftp.mozilla.org' DIRN = 'pub/mozilla.org/webtools' FILE = 'bugzilla-3.6.7.tar.gz' def main(): try: f = ftplib.FTP(HOST) except (socket.error, socket.gaierror): print 'ERROR:cannot reach " %s"' % HOST return print '***Connected to host "%s"' % HOST try: f.login() except ftplib.error_perm: print 'ERROR: cannot login anonymously' f.quit() return print '*** Logged in as "anonymously"' try: f.cwd(DIRN) except ftplib.error_perm: print 'ERRORL cannot CD to "%s"' % DIRN f.quit() return print '*** Changed to "%s" folder' % DIRN try: #傳一個回調(diào)函數(shù)給retrbinary() 它在每接收一個二進制數(shù)據(jù)時都會被調(diào)用 f.retrbinary('RETR %s' % FILE, open(FILE, 'wb').write) except ftplib.error_perm: print 'ERROR: cannot read file "%s"' % FILE os.unlink(FILE) else: print '*** Downloaded "%s" to CWD' % FILE f.quit() return if name == 'main': main() os.listdir(dirname):列出dirname下的目錄和文件 os.getcwd():獲得當前工作目錄 os.curdir:返回當前目錄('.') os.chdir(dirname):改變工作目錄到dirname os.path.isdir(name):判斷name是不是一個目錄,name不是目錄就返回false os.path.isfile(name):判斷name是不是一個文件,不存在name也返回false os.path.exists(name):判斷是否存在文件或目錄name os.path.getsize(name):獲得文件大小,如果name是目錄返回0L os.path.abspath(name):獲得絕對路徑 os.path.normpath(path):規(guī)范path字符串形式 os.path.split(name):分割文件名與目錄(事實上,如果你完全使用目錄,它也會將最后一個目錄作為文件名而分離,同時它不會判斷文件或目錄是否存在) os.path.splitext():分離文件名與擴展名 os.path.join(path,name):連接目錄與文件名或目錄 os.path.basename(path):返回文件名 os.path.dirname(path):返回文件路徑 os.remove(dir) #dir為要刪除的文件夾或者文件路徑 os.rmdir(path) #path要刪除的目錄的路徑。需要說明的是,使用os.rmdir刪除的目錄必須為空目錄,否則函數(shù)出錯。 os.path.getmtime(name) #獲取文件的修改時間 os.stat(path).st_mtime#獲取文件的修改時間 os.stat(path).st_ctime #獲取文件修改時間 os.path.getctime(name)#獲取文件的創(chuàng)建時間 python中對文件、文件夾的操作需要涉及到os模塊和shutil模塊。 創(chuàng)建文件: 1) os.mknod("test.txt") 創(chuàng)建空文件 2) open("test.txt",w) 直接打開一個文件,如果文件不存在則創(chuàng)建文件 創(chuàng)建目錄: os.mkdir("file") 創(chuàng)建目錄 復(fù)制文件: shutil.copyfile("oldfile","newfile") oldfile和newfile都只能是文件 shutil.copy("oldfile","newfile") oldfile只能是文件夾,newfile可以是文件,也可以是目標目錄 復(fù)制文件夾: shutil.copytree("olddir","newdir") olddir和newdir都只能是目錄,且newdir必須不存在 重命名文件(目錄) os.rename("oldname","newname") 文件或目錄都是使用這條命令 移動文件(目錄) shutil.move("oldpos","newpos") 刪除文件 os.remove("file") 刪除目錄 os.rmdir("dir") 只能刪除空目錄 shutil.rmtree("dir") 空目錄、有內(nèi)容的目錄都可以刪 轉(zhuǎn)換目錄 os.chdir("path") 換路徑 判斷目標 os.path.exists("goal") 判斷目標是否存在 os.path.isdir("goal") 判斷目標是否目錄 os.path.isfile("goal") 判斷目標是否文件 Python 實現(xiàn)文件復(fù)制、刪除 import os import shutil filelist=[] rootdir="/home/zoer/aaa" filelist=os.listdir(rootdir) for f in filelist: filepath = os.path.join( rootdir, f ) if os.path.isfile(filepath): os.remove(filepath) print filepath+" removed!" elif os.path.isdir(filepath): shutil.rmtree(filepath,True) print "dir "+filepath+" removed!" 用python實現(xiàn)了一個小型的自動發(fā)版本的工具。這個“自動發(fā)版本”有點虛, 只是簡單地把debug 目錄下的配置文件復(fù)制到指定目錄,把Release下的生成文件復(fù)制到同一指定,過濾掉不需要的文件夾(.svn),然后再往這個指定目錄添加幾個特定的 文件。 這個是我的第一個python小程序。 下面就來看其代碼的實現(xiàn)。 首先插入必要的庫: import os import os.path import shutil import time, datetime 然后就是一大堆功能函數(shù)。第一個就是把某一目錄下的所有文件復(fù)制到指定目錄中: def copyFiles(sourceDir, targetDir): if sourceDir.find(".svn") > 0: return for file in os.listdir(sourceDir): sourceFile = os.path.join(sourceDir, file) targetFile = os.path.join(targetDir, file) if os.path.isfile(sourceFile): if not os.path.exists(targetDir): os.makedirs(targetDir) if not os.path.exists(targetFile) or(os.path.exists(targetFile) and (os.path.getsize(targetFile) != os.path.getsize(sourceFile))): open(targetFile, "wb").write(open(sourceFile, "rb").read()) if os.path.isdir(sourceFile): First_Directory = False copyFiles(sourceFile, targetFile) 刪除一級目錄下的所有文件: def removeFileInFirstDir(targetDir): for file in os.listdir(targetDir): targetFile = os.path.join(targetDir, file) if os.path.isfile(targetFile): os.remove(targetFile) 復(fù)制一級目錄下的所有文件到指定目錄: def coverFiles(sourceDir, targetDir): for file in os.listdir(sourceDir): sourceFile = os.path.join(sourceDir, file) targetFile = os.path.join(targetDir, file) #cover the files if os.path.isfile(sourceFile): open(targetFile, "wb").write(open(sourceFile, "rb").read()) 復(fù)制指定文件到目錄: def moveFileto(sourceDir, targetDir): shutil.copy(sourceDir, targetDir) 往指定目錄寫文本文件: def writeVersionInfo(targetDir): open(targetDir, "wb").write("Revison:") 返回當前的日期,以便在創(chuàng)建指定目錄的時候用: def getCurTime(): nowTime = time.localtime() year = str(nowTime.tm_year) month = str(nowTime.tm_mon) if len(month) < 2: month = '0' + month day = str(nowTime.tm_yday) if len(day) < 2: day = '0' + day return (year + '-' + month + '-' + day) 然后就是主函數(shù)的實現(xiàn)了: if name =="main": print "Start(S) or Quilt(Q) " flag = True while (flag): answer = raw_input() if 'Q' == answer: flag = False elif 'S'== answer : formatTime = getCurTime() targetFoldername = "Build " + formatTime + "-01" Target_File_Path += targetFoldername copyFiles(Debug_File_Path, Target_File_Path) removeFileInFirstDir(Target_File_Path) coverFiles(Release_File_Path, Target_File_Path) moveFileto(Firebird_File_Path, Target_File_Path) moveFileto(AssistantGui_File_Path, Target_File_Path) writeVersionInfo(Target_File_Path+"\ReadMe.txt") print "all sucess" else: print "not the correct command"linux下python腳本判斷目錄和文件是否存在 if os.path.isdir('E:test'): pass else: os.mkdir('E:test') ##os.mkdir() 只會創(chuàng)建一個目錄,不可以級聯(lián)創(chuàng)建 eg2: if not os.path.exists('E:test'): ###判斷文件是否存在,返回布爾值 os.makedirs('E:test') ##os.makedirs() 這個連同中間的目錄都會創(chuàng)建,類似于參數(shù)mkdir -p eg3: try: fp = open("file_path") catch exception: except 和catch的區(qū)別? os.mkdir('file_path') ##os.mkdir() 只會創(chuàng)建一個目錄,不可級聯(lián)創(chuàng)建,但要有異常處理的意識 fp = open("file_path" eg4:實測 #!/<a href="http://so.21ops.com/cse/search?s=9181936462520079739&entry=1&q=usr" class="bdcs-inlinelink" target="_blank">usr</a>/bin/env python import os FILE_PATH='/home/wuxy/aaa111/222/333/444.txt' ###444.txt 不會當做文件,而是當做目錄 if os.path.exists('FILE_PATH'): ##目錄存在,返回為真 print 'dir not exists' os.makedirs(FILE_PATH) ###FILE_PATH不用加引號。否則會報錯 else: print 'dir exists' python實現(xiàn)ftp上傳下載文件 #!/usr/bin/env python # encoding: utf-8 author = "pwy" ''' 上傳:上傳文件并備份到其他目錄 下載:下載文件,并刪除遠端文件 ''' from ftplib import FTP from time import sleep import os,datetime,logging from shutil import move HOST = "192.168.1.221" USER = "sxit" PASSWORD = "1qaz!QAZ" #PORT = "" #Upload the file, change the directory remotedir = "/home/test/" localdir = "/home/sxit/object/" bakdir = "/home/sxit/bak" #Download the file, change the directory Remoredir = "/home/sxit/object1/" Localdir = "/root/ftp-logging" LOGFILE = datetime.datetime.now().strftime('%Y-%m-%d')+'.log' logging.basicConfig(level=logging.INFO, format='%(asctime)s %(filename)s %(levelname)s %(message)s', # datefmt='%a, %d %b %Y %H:%M:%S', filename= LOGFILE, filemode='a') logging.FileHandler(LOGFILE) class CLASS_FTP: def init(self,HOST,USER,PASSWORD,PORT='21'): self.HOST = HOST self.USER = USER self.PASSWORD = PASSWORD self.PORT = PORT self.ftp=FTP() self.flag=0 # 0:no connected, 1: connting def Connect(self): try: if self.flag == 1: logging.info("ftp Has been connected") else: self.ftp.connect(self.HOST,self.PORT) self.ftp.login(self.USER,self.PASSWORD) # self.ftp.set_pasv(False) self.ftp.set_debuglevel(0) self.flag=1 except Exception: logging.info("FTP login failed") def Up_load(self,remotedir,localdir,bakdir): try: self.ftp.cwd(remotedir) for i in os.listdir(localdir): if i.endswith('.txt'): file_handler = open(i,'rb') self.ftp.storbinary('STOR %s' % i,file_handler) logging.info("%s already upload ."%i) try: if os.path.isdir(bakdir): move(i,bakdir) logging.info("%s move to %s ." % (i,bakdir)) else: print "Move the file FAILED" logging.info("Move the %s to %s FAILED!"%(i,bakdir)) except Exception: logging.info("ftp delete file faild !!!!!") file_handler.close() # self.ftp.quit() except Exception: logging.info("Up_load failed") def Down_load(self,Remoredir,Localdir): try: self.ftp.cwd(Remoredir) for i in self.ftp.nlst(): if i.endswith('.NET'): #match file file_handler = open(i,'wb') self.ftp.retrbinary('RETR %s' % i,file_handler.write) logging.info("%s already down ."%i) try: self.ftp.delete(i) logging.info("%s already deleted!"%i) except Exception: logging.info("ftp delete file faild !!!!!") file_handler.close() #self.ftp.quit() except Exception: logging.info("Down_load failed") if name == 'main': ftp = CLASS_FTP(HOST,USER,PASSWORD) while True: ftp.Connect() # ftp.Down_load(Remoredir,Localdir) ftp.Up_load(remotedir,localdir,bakdir) sleep(30)常用函數(shù)用手冊查看,以下只是簡略,因為沒用用到,[待整理]: login(user='',passwd='', acct='') 登錄到FTP 服務(wù)器,所有的參數(shù)都是可選的 pwd() 當前工作目錄 cwd(path) 把當前工作目錄設(shè)置為path dir([path[,...[,cb]]) 顯示path 目錄里的內(nèi)容,可選的參數(shù)cb 是一個回調(diào)函數(shù),會被傳給retrlines()方法 nlst([path[,...]) 與dir()類似,但返回一個文件名的列表,而不是顯示這些文件名 retrlines(cmd [, cb]) 給定FTP 命令(如“RETR filename”),用于下載文本文件??蛇x的回調(diào)函數(shù)cb 用于處理文件的每一行 retrbinary(cmd, cb[,bs=8192[, ra]]) 與retrlines()類似,只是這個指令處理二進制文件?;卣{(diào)函數(shù)cb 用于處理每一塊(塊大小默認為8K)下載的數(shù)據(jù)。 storlines(cmd, f) 給定FTP 命令(如“STOR filename”),以上傳文本文件。要給定一個文件對象f storbinary(cmd, f[,bs=8192]) 與storlines()類似,只是這個指令處理二進制文件。要給定一個文件對象f,上傳塊大小bs 默認為8Kbs=8192]) rename(old, new) 把遠程文件old 改名為new delete(path) 刪除位于path 的遠程文件 mkd(directory) 創(chuàng)建遠程目錄 ftp '''第一個例子''' def get_C(self,target_dir=None): C = [] print "PWD:", self.ftp.pwd() if target_dir is not None: self.ftp.cwd(target_dir)# change working directory to target_dir server_file_list = [] fuck_callback = lambda x: (server_file_list.append(x)) self.ftp.retrlines('LIST', fuck_callback) # print server_file_list server_file_items = self.filter_dir_list(server_file_list) for item in server_file_items: if item.is_dir: print 'name = ', item.name sub_C = self.get_C(item.name) # sub_C = ['/'+item.name+'/'+cc.name for cc in sub_C] for cc in sub_C: cc.name = '/' + item.name + cc.name print 'name --- ',cc.name C.extend(sub_C) else: item.name = '/' + item.name C.append(item) self.ftp.cwd('..') return C def runtest(self,next_dir): C = ftp.get_C(next_dir) next_dir2=next_dir[2:] C = [cc.pack for cc in C] for i in C: print i next_dir1=i pos=next_dir1.rindex('/') next_dir3= next_dir1[0:pos] all_path=next_dir2 + next_dir3 print all_path next_dir_local = all_path.decode('utf8').encode('gbk') try: print next_dir_local #os.makedirs(next_dir_local) except OSError: pass #os.chdir(next_dir_local) localfile=next_dir1[pos+1:] print localfile allall_path=all_path + "/" + localfile self.ftp.cwd('/') print self.ftp.pwd() #file_handler = open(localfile, 'wb') #self.ftp.retrbinary('RETR %s' % (allall_path), file_handler.write) #file_handler.close() '''第一個例子獲取成/home/user/test.txt這樣的列表''' 第二個例子 def download_files(self, localdir='./', remotedir='./'): try: self.ftp.cwd(remotedir) except: debug_print('目錄%s不存在,繼續(xù)...' % remotedir) return if not os.path.isdir(localdir): pass #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] print "filename:",filename 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()) f.download_files(rootdir_local, rootdir_remote) '''第二個例子''' sftp s_file = path.join(path_name,name).replace('\','/') def process_sftp_dir(path_name): """ 此函數(shù)遞歸處理sftp server端的目錄和文件,并在client端創(chuàng)建所有不存在的目錄,然后針對每個文件在兩端的全路徑執(zhí)行g(shù)et操作. path_name第一次的引用值應(yīng)該是source_path的值 """ d_path = path_name.replace(source_path,destination_path,1) if not path.exists(d_path): # 若目標目錄不存在則創(chuàng)建 print('%s----Create Local Dir: %s' % (' '*8,d_path)) try: makedirs(d_path) # 遞歸創(chuàng)建不存在的目錄 except Exception as err: print('%s----Create %s Failed' % (' '*8,d_path)) print('{}----{}'.format(' '*8,err)) exit(10) for name in (i for i in sftp.listdir(path=path_name) if not i.startswith('.')): """去掉以.開頭的文件或目錄""" s_file = path.join(path_name,name).replace('\','/') # 在win環(huán)境下組合路徑所用的'\'換成'/' d_file = s_file.replace(source_path,destination_path,1) # 目標端全路徑 chk_r_path_result = check_remote_path(s_file) if chk_r_path_result == 'file': # 文件 sftp_get(s_file,d_file,12) elif chk_r_path_result == 'directory': # 目錄 process_sftp_dir(s_file) # 遞歸調(diào)用本身 process_sftp_dir(source_path) 區(qū)別很大 ftp: ftp.retrlines('LIST', fuck_callback) 完全是循環(huán),目錄的進行循環(huán)操作,而文件下載。最底層目錄的文件下載完,回歸上級目錄。繼續(xù)循環(huán)。 self.ftp.pwd() self.ftp.dir(self.get_file_list) get_file_list(self, line) self.ftp.cwd('..') self.ftp.cwd(remotedir) self.download_file(local, filename) 建立好本地目錄,然后cd到遠程目錄,下載 sftp: sftp.listdir s_file = path.join(path_name,name).replace('\','/') 指定源全路徑下載 代碼格式亂了,詳細例子 ftp 第一個例子 # !/usr/bin/env python # -*-coding:utf-8-*- from ftplib import FTP from time import sleep import os, datetime,logging,time import string,re d1 = datetime.datetime.now() '''months=['Jan','Feb','March','Apr','May','Jun','Jul','Aug','Sep'] patternm = r'2017.*|201611.*|201612.*|201610.*' patternxml = r'.*2016' patternx = r'xx.*''''' HOST = "192.168.1.100" USER = "ftpuser3" PASSWORD = "test1passwd" class Myfile(object): def init(self, name, size, mtime): self.name = name # 文件名字 self.mtime = mtime # 文件創(chuàng)建時間 self.is_dir = False # 是否為文件夾,默認為不是文件夾 #self.size = float(size) / (1024 * 1024) # 文件大小 size = float(size) if size > 1024*1024: self.size = str('%.2f'%(size / (1024*1024))) + 'MB' elif size > 1024: self.size = str('%.2f'%(size / 1024)) + 'KB' else: self.size = str(size) + 'Bytes' @property def is_file(self): return not self.is_dir @property def dir_property(self): if self.is_dir==True: return 'dir' return 'file' def show(self): print '[%s], [%s], [%s], [%s]' % (self.name, self.size, self.mtime, self.dir_property) @property def pack(self): """ 將myfile對象封裝為一個字符串 :return: """ #return '[%s][%s][%s]'%(self.name, self.size, self.mtime) #return '[%s][%s]'%(self.name, self.size) return '%s' %(self.name) class CLASS_FTP: def init(self, HOST, USER, PASSWORD, PORT='21'): self.HOST = HOST self.USER = USER self.PASSWORD = PASSWORD self.PORT = PORT self.ftp = FTP() self.flag = 0 # 0:no connected, 1: connting def Connect(self): try: if self.flag == 1: logging.info("ftp Has been connected") else: self.ftp.connect(self.HOST, self.PORT) self.ftp.login(self.USER, self.PASSWORD) # self.ftp.set_pasv(False) self.ftp.set_debuglevel(0) self.flag = 1 except Exception: logging.info("FTP login failed") def str_codec_std(self,mystr): return mystr.decode('utf8').encode('gbk') def dirmakedirs(self,next_dir_local,local_dir): # next_dir_local2= next_dir_local.split('/')[1:] next_dir_local2 = next_dir_local[1:].replace('/', '\') # next_dir_localw = next_dir_local2.decode('utf8').encode('gbk') # windows用這個 s_file = os.path.join(local_dir, next_dir_local2) print "s_file", s_file if not os.path.exists(s_file): try: os.makedirs(s_file) except OSError: pass os.chdir(s_file) def filter_dir_list(self,mystr_list): res = [] for mystr in mystr_list: #mystr = self.str_codec_std(mystr) # print "mystr is :%s" % mystr file_info = string.split(mystr, maxsplit=8) name = file_info[8] print 'name = ', name if name == '.' or name == '..': continue size = file_info[4] mtime = '%s-%s-%s' % (file_info[5], file_info[6], file_info[7]) myfile = Myfile(name=name, size=size, mtime=mtime) dir_info = file_info[0] if dir_info[0] == 'd': myfile.is_dir = True res.append(myfile) return res def get_C(self,target_dir=None,local_dir=None): C = [] if target_dir is not None: self.ftp.cwd(target_dir)# change working directory to target_dir server_file_list = [] fuck_callback = lambda x: (server_file_list.append(x)) self.ftp.retrlines('LIST', fuck_callback) next_dir_local = self.ftp.pwd() self.dirmakedirs(next_dir_local, local_dir) server_file_items = self.filter_dir_list(server_file_list) for item in server_file_items: if item.is_dir: sub_C = self.get_C(item.name,local_dir) for cc in sub_C: cc.name = '/' + item.name + cc.name C.extend(sub_C) else: item.name = '/' + item.name C.append(item) self.ftp.cwd('..') return C def runtest(self,local_dir,next_dir): os.chdir(local_dir) C = ftp.get_C(next_dir,local_dir) next_dir2=next_dir[2:] C = [cc.pack for cc in C] print "C:",C for i in C: next_dir1=i pos=next_dir1.rindex('/') next_dir3= next_dir1[0:pos] all_path=next_dir2 + next_dir3 self.dirmakedirs(all_path, local_dir) next_dir_localz = all_path[1:].replace('/', '\') '''# next_dir_local = next_dir_localz # next_dir_local = next_dir_localz.decode('utf8').encode('gbk') #windows用這個''' # s_file = os.path.join(local_dir, next_dir_localz) # try: # os.makedirs(s_file) # except OSError: # pass # os.chdir(s_file) localfile=next_dir1[pos+1:] print localfile allall_path=all_path + "/" + localfile file_handler = open(localfile, 'wb') self.ftp.retrbinary('RETR %s' % (allall_path), file_handler.write) file_handler.close() if name == 'main': ftp = CLASS_FTP(HOST, USER, PASSWORD) ftp.Connect() ftp.runtest('D:\ftp','./') d2 = datetime.datetime.now() print d2 - d1 '''參數(shù)亂七八糟''' ftp 第二個例子 別人2010寫好的 # !/usr/bin/env python # coding:utf-8 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: print "now:",self.ftp.pwd() self.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: print "remotefile:",remotefile 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: print "remotedir:",remotedir self.ftp.cwd(remotedir) except: debug_print('目錄%s不存在,繼續(xù)...' % remotedir) return if not os.path.isdir(localdir): # pass os.makedirs(localdir) debug_print('切換至目錄 %s' % self.ftp.pwd()) self.file_list = [] print(self.ftp.dir()) self.ftp.dir(self.get_file_list) remotenames = self.file_list # print(remotenames) # return for item in remotenames: filetype = item[0] filename = item[1] print "filename:",filename local = os.path.join(localdir, filename).replace('\', '/') 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): print "line1:", line ret_arr = [] file_arr = self.get_filename(line) print "file_arr:",file_arr if file_arr[1] not in ['.', '..']: self.file_list.append(file_arr) def get_filename(self, line): print "line2:",line print type(line) pos = line.rfind(':') while (line[pos] != ' '): pos += 1 while (line[pos] == ' '): pos += 1 print pos 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 發(fā)生錯誤: %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 = '192.168.1.100' # ftp地址 username = 'ftpuser3' # 用戶名 password = 'test1passwd' # 密碼 port = 21 # 端口號 #rootdir_local = '.' + os.sep + 'bak/' # 本地目錄 rootdir_local = 'D:/ftp/' 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 成功執(zhí)行了備份 " % datenow debug_print(logstr) file.write(logstr) file.close()
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com