1. 程式人生 > 實用技巧 >Python標準庫 - ftplib模組

Python標準庫 - ftplib模組

說明:Python中預設安裝的ftplib模組定義了FTP類,可用來實現簡單的ftp客戶端,用於上傳或下載檔案。

ftplib模組常用方法:

ftp登陸連線
from ftplib import FTP            #載入ftp模組
ftp=FTP()                         #設定變數
ftp.set_debuglevel(2)             #開啟除錯級別2,顯示詳細資訊
ftp.connect("IP","port")          #連線的ftp sever和埠
ftp.login("user","password")      #連線的使用者名稱,密碼
print ftp.getwelcome()            #打印出歡迎資訊
ftp.cmd("xxx/xxx")                #進入遠端目錄
bufsize=1024                      #設定的緩衝區大小
filename="filename.txt"           #需要下載的檔案
file_handle=open(filename,"wb").write #以寫模式在本地開啟檔案
ftp.retrbinaly("RETR filename.txt",file_handle,bufsize) #接收伺服器上檔案並寫入本地檔案
ftp.set_debuglevel(0)             #關閉除錯模式
ftp.quit()                        #退出ftp
 
ftp相關命令操作
ftp.cwd(pathname)                 #設定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檔案

ftplib模組的連線,檔案上傳下載:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from ftplib import FTP
from ftplib import error_perm

host = '127.0.0.1'
username = '******'
password = '******'
port = 21

def ftpconnect(host, port, username, password):
    ftp = FTP()
    # ftp.set_debuglevel(2)            # 開啟除錯級別2,顯示詳細資訊
    # ftp.encoding = 'utf-8'           # 解決中文編碼問題,預設是latin-1
    try:
        ftp.connect(host, port)        # 連線
        ftp.login(username, password)  # 登入,如果匿名登入則用空串代替即可
        print ftp.getwelcome()         # 列印歡迎資訊
    except(socket.error, socket.gaierror):   # ftp 連線錯誤
        print "ERROR: cannot connect [{}:{}]" .format(host, port)
        return None
    except error_perm:                       # 使用者登入認證錯誤
        print "ERROR: user Authentication failed "
        return None
    return ftp

# 獲取/mcl下的檔案
def get_ftp_file(ftp_conn, ftp_path):
    return ftp_conn.nlst(ftp_path)

# 判斷檔案在ftp伺服器下是否存在
def is_ftp_file(ftp_conn, ftp_path):
    try:
        if ftp_path in ftp_conn.nlst(os.path.dirname(ftp_path)):
            return True
        else:
            return False
    except error_perm:
        return False

# 下載檔案
def downloadfile(ftp, remotepath, localpath):
    bufsize = 1024              # 設定緩衝塊大小
    fp = open(localpath, 'wb')  # 以寫模式在本地開啟檔案
    # 接收伺服器上檔案並寫入本地檔案
    # ftp.retrbinary('RETR ' + remotepath.decode('utf-8').encode('GBK'), fp.write, bufsize)  # 檔案路徑中文
    ftp.retrbinary('RETR ' + remotepath, fp.write, bufsize)                                  # 檔案路徑英文
    print 'download file complete', localpath
    ftp.set_debuglevel(0)       # 關閉除錯
    fp.close()                  # 關閉檔案
    ftp.quit()                  # 退出ftp伺服器

# 上傳檔案
def uploadfile(ftp, remotepath, localpath):
    bufsize = 1024              # 設定緩衝塊大小
    fp = open(localpath, 'rb')  # 以讀模式在本地開啟檔案
    # ftp.storbinary('STOR ' + remotepath.decode('utf-8').encode('GBK'), fp, bufsize)     # 檔案路徑中文
    ftp.storbinary('STOR ' + remotepath, fp, bufsize)                                     # 檔案路徑英文
    print 'upload file complete', remotepath
    ftp.set_debuglevel(0)       # 關閉除錯
    fp.close()                  # 關閉檔案
    ftp.quit()                  # 退出ftp伺服器

if __name__ == '__main__':
    ftp = ftpconnect(host, port, username, password)
    print get_ftp_file(ftp, '/mcl')
    # downloadfile(ftp, "/mcl/ftp_mcl.txt", "mcl.txt")    # 將ftp下檔案/mcl/ftp_mcl.txt下載到本地命名為mcl.txt
    # uploadfile(ftp, "/mcl/ftp_mcl.txt", "mcl.txt")      # 將本地檔案mcl.txt上傳到ftp路徑/mcl下命名為ftp_mcl.txt
    # downloadfile(ftp, "/中文名稱/ftp_mcl.txt", "mcl.txt")
    # uploadfile(ftp, "/中文名稱/ftp_mcl.txt", "mcl.txt")