最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
當前位置: 首頁 - 科技 - 知識百科 - 正文

使用pythonftp和sftp的實例介紹

來源:懂視網(wǎng) 責編:小采 時間:2020-11-27 14:25:02
文檔

使用pythonftp和sftp的實例介紹

使用pythonftp和sftp的實例介紹:這篇文章詳解使用python ftp和sftp的實例介紹python ftp 上傳、下載文件 #獲取昨天日期 TODAY = datetime.date.today() YESTERDAY = TODAY - datetime.timedelta(days=1)CURRENTDAY=YESTERDAY.strftime('
推薦度:
導(dǎo)讀使用pythonftp和sftp的實例介紹:這篇文章詳解使用python ftp和sftp的實例介紹python ftp 上傳、下載文件 #獲取昨天日期 TODAY = datetime.date.today() YESTERDAY = TODAY - datetime.timedelta(days=1)CURRENTDAY=YESTERDAY.strftime('

這篇文章詳解使用python ftp和sftp的實例介紹

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

文檔

使用pythonftp和sftp的實例介紹

使用pythonftp和sftp的實例介紹:這篇文章詳解使用python ftp和sftp的實例介紹python ftp 上傳、下載文件 #獲取昨天日期 TODAY = datetime.date.today() YESTERDAY = TODAY - datetime.timedelta(days=1)CURRENTDAY=YESTERDAY.strftime('
推薦度:
標簽: 實例 ftp python
  • 熱門焦點

最新推薦

猜你喜歡

熱門推薦

專題
Top