用Python寫一個ftp下載腳本

Python寫一個ftp下載腳本

----基於Red Hat Enterprise Linux Server release 6.4 (Santiago);python 2.6.6
python

Ps:少俠我接觸Python半個月以來接到的第一個需求,雖然如此簡單的一個腳本,少俠我磕磕絆絆卻用了將近一天半的時間才寫出來,但仍是很開心,畢竟也粗來了,廢話很少說,切入正題。由於一開始沒有用過ftplib模塊,因此各類谷歌度娘一堆資料雜亂不堪,話不清,理不亂的,本文實現的功能簡單,下面介紹一下,以避免誤導讀者。 正則表達式

需求:師傅給了一個需求,寫一個ftp自動下載的腳本。彷佛下載文件沒什麼難的,用ftp下載文件彷佛更簡單,getmget完事。可是需求是,服務器上主要是dat文件在備份,當備份完成後,會生成一個同名字的ack文件,要把備份完成的dat文件下載到本地,而後刪除雲端服務器的ackdat文件。雖然聽着這個需求挺找抽,也挺容易實現的,但誰叫我是菜鳥呢,當時就蒙圈了。 服務器

  ftp地址192.168.213.129 socket

用戶名dmp     函數

密碼zcxc123! ui

文件位置/var/ftp/pub/pizi spa

我看了下大概3分鐘生成一個文件,文件忙時可能要60M以上,網管網估計懸,師父讓我先寫腳本,回頭聯繫拉內網走。吐槽完畢,開始上乾貨: .net

----------------------------------------------分隔線--------------------------------------------- ip

下面正式切入正題: utf-8

1.       首先要引入ftplib模塊,Python中默認安裝的ftplib模塊定義了FTP類,其中函數有限,可用來實現簡單的ftp客戶端,用於上傳或下載文件。網上有不少遠程登陸的實例,下面寫一種最適合菜鳥的寫法

2.       基本的代碼以下:

from ftplib import FTP

###引入ftp模塊

import re

###引入re模塊使Python擁有所有的正則表達式的功能

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.deletefilename

###刪除ftp服務器上的文件

3.       下面粘上個人代碼

#!/usr/bin/python

#coding=utf-8

import re

import os

from ftplib import FTP

os.chdir('更改的當前目錄,由於默認下載到當前目錄,這樣就能夠下載到本身制定的目錄‘)

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文件 

                        b=a.split('-') 

                        ###將a按-分割
                        
b[6]=time.strftime('%H%M',time.localtime(time.time()))

                        ###獲取當前的時間 年月,將下標爲6的元素替換

                        c='-'.join(b)

                        ###將b按-合併成字符串

                        ftp.retrbinary("RETR %s"%a+".dat",open(c+".dat",'wb').write)

                                        #若是兩文件都存在,下載.dat文件,而且open裏邊的wb參數能夠更改

                                        #wb是以二進制模式下載,wt是以ASCII模式下載

                      ftp.delete(name)

                                                         #刪除匹配上的.ack文件

                      ftp.delete(a + ".dat")

                                                         #刪除匹配上的.dat文件

       else:

                continue

ftp.quit()

print "ftp down ok"

4.       登陸ftp服務器的方法有不少,而且匹配在此能夠不用正則,用spilt分割可能更簡單,方法有不少,能實現就行。

5.如今粘上加入異常捕捉後的代碼

     #############################################
# Name: Ftp download
# Author: LCY
# Version: 1.0.20150826
# Feature: Download and determine if you are downloading.If you are downloading, exiting the script.
#############################################
#!/usr/bin/python
#coding=utf-8
import ftplib  
import os  
import socket  
import sys  
import re
import time
#os.chdir('/cstreaming/impalacsv')
#HOST = 'IP'  
#DIRN = '/DRITARY'   
#USER_NAME = 'NAME'  
#PWD = 'PASSWD'  
os.chdir('/root/Desktop')
HOST = '172.16.10.129'
DIRN='/var/ftp/pub/pizi'
USER_NAME='root'
PWD='westos'  
def DownloadFile():  
    try:  
        f = ftplib.FTP(HOST)  
    except(socket.error, socket.gaierror) as e:  
        print('ERROR:cannot reach %s' % HOST)  
        return  
    print('*** Connected to host %s' % HOST)  


    try:  
        f.login(USER_NAME, PWD)  
    except ftplib.error_perm:  
        print('ERROR:cannot login USER_NAME=%s, PWD=%s' % (USER_NAME, PWD))  
        f.quit()  
        return  
    print('*** Logined in as %s' % USER_NAME)  
  
    try:  
        f.cwd(DIRN)  
    except ftplib.error_perm:  
        print('ERROR:cannot CD to %s' % DIRN)  
        f.quit()  
        return  
    try:  
        list = f.nlst()
        for file_name in list:
            match = re.match(r'(.*)\.dat$',file_name)
            if match:
                a = match.group(1)
                b=a.split('-')
                # b[4]=time.strftime('%Y%m%d%H%M',time.localtime(time.time()))
                # b[4]='20'+b[4]
                timeArry = time.strptime(b[4],"%y%m%d%H%M")
                otherStyleTime = time.strftime("%Y%m%d%H%M",timeArry)
                b[4]=otherStyleTime
                g=b[4]+"-"+b[3]+"-"+b[0]+"-"+b[1]+"-"+b[2]+".DAT"
                f.retrbinary("RETR %s"%a+".dat",open(g,'wb').write)
                f.delete(file_name)
                print "Ftp file Downloaded success"
            else:
                continue
    except ftplib.error_perm:  
        print('ERROR:cannot read file %s' % file_name)  
        os.unlink(file_name)  
        #file.close()  
    else:  
        print('*** Downloaded %s to %s' % (file_name, os.getcwd()))  
    f.quit()  
    return 


def is_Running(process):
    try:
        pids = os.popen("ps -ef | egrep 'python.*%s' | grep -v grep | awk '{print $2}' " % process)
        for pid in pids.readlines():
            if pid != '' and int(pid) != os.getpid():
                return True
        return False
    except Exception,e:
        return False


if __name__ == '__main__':
    if is_Running('back_newftp.py'):
        print 'back_newftp is running ,exit.'
        exit(1)
    else:
        print 'start back_newftp.py'
    DownloadFile()  




 

                                                                                             新浪微博

                                                                                        @皮子喜歡打籃球

相關文章
相關標籤/搜索