標籤:
用
Python
寫一個
ftp
下載指令碼
----基於Red Hat Enterprise Linux Server release 6.4 (Santiago);python 2.6.6
Ps:少俠我接觸Python半個月以來接到的第一個需求,雖然如此簡單的一個指令碼,少俠我磕磕絆絆卻用了將近一天半的時間才寫出來,但還是很開心,畢竟也粗來了,廢話不多說,切入正題。因為一開始沒有用過ftplib模組,所以各種Google度娘一堆資料雜亂不堪,話不清,理不亂的,本文實現的功能簡單,下面介紹一下,以免誤導讀者。
需求:師傅給了一個需求,寫一個ftp自動下載的指令碼。似乎下載檔案沒什麼難的,用ftp下載檔案似乎更簡單,get,mget完事。但是需求是,伺服器上主要是dat檔案在備份,當備份完成後,會產生一個同名字的ack檔案,要把備份完成的dat檔案下載到本地,然後刪除雲端伺服器的ack和dat檔案。雖然聽著這個需求挺找抽,也挺容易實現的,但誰叫我是菜鳥呢,當時就蒙圈了。
ftp地址192.168.213.129
使用者名稱dmp
密碼zcxc123!
檔案位置/var/ftp/pub/pizi
我看了下大概3分鐘產生一個檔案,檔案忙時可能要60M以上,網管網估計懸,師父讓我先寫指令碼,回頭聯絡拉內網走。吐槽完畢,開始上乾貨:
----------------------------------------------分隔線---------------------------------------------
下面正式切入正題:
1. 首先要引入ftplib模組,Python中預設安裝的ftplib模組定義了FTP類,其中函數有限,可用來實現簡單的ftp用戶端,用於上傳或下載檔案。網上有很多遠程登入的執行個體,下面寫一種最適合菜鳥的寫法
2. 基本的代碼如下:
from ftplib import FTP
###引入ftp模組
import re
###引入re模組使Python擁有全部的Regex的功能
ftp = FTP(‘目的主機的ip地址’)
####串連ftp伺服器
ftp.login(‘user’,’passwd’)
###登入ftp伺服器
ftp.cwd(‘ftp存放檔案的路徑’)
###設定一個你要登入的目錄,下載上傳檔案都在此目錄
ftp.nlst()
###擷取目錄下的檔案
file_handle=open(filename,"wb").write
###以寫入模式在本地開啟檔案
ftp.retrbinary("RETR filename.txt",file_handel,bufsize)
###下載ftp檔案
ftp.delete(filename)
###刪除ftp伺服器上的檔案
3. 下面粘上My Code
#!/usr/bin/python
#coding=utf-8
import re
from ftplib import FTP
ftp = FTP(‘192.168.213.129‘)
ftp.login(‘root‘,‘westos‘)
print ‘welcome‘
print ftp.getwelcome()
ftp.cwd(‘/var/ftp/pub/pizi‘)
bufsize=1024 #設定緩衝塊大小
list = ftp.nlst() #獲得一個目前的目錄檔案的的列表
for name in list: #用一個for迴圈取列表中的元素
print (name)
match = re.match(r‘(.*)\.ack$‘,name) #匹配去除的元素,用正則
if match:
a = match.group(1) #如果匹配成功,取出.ack前面的檔案名稱
if (a + ".dat"): #然後在查看是否有同名字的.dat檔案
ftp.retrbinary("RETR %s"%a+".dat",open(a+".dat",‘wb‘).write)
#如果兩檔案都存在,下載.dat檔案
ftp.delete(name)
#刪除匹配上的.ack檔案
ftp.delete(a + ".dat")
#刪除匹配上的.dat檔案
else:
continue
ftp.quit()
print "ftp down ok"
4. 登入ftp伺服器的方法有很多,並且匹配在此可以不用正則,用spilt分割可能更簡單,方法有很多,能實現就行。
新浪微博
@皮子喜歡打籃球
用Python寫一個ftp下載指令碼