Python 实现 FTP 上传、下载文件

Python 中,可以使用 ftplib 模块的 FTP 对象来实现 FTP 客户端功能。API 的主要用法如下:

# 例:FTP编程
from ftplib import FTP

ftp = FTP()
timeout = 30
port = 21
ftp.connect('192.168.1.188',port,timeout) # 连接FTP服务器
ftp.login('UserName','888888') # 登录
print ftp.getwelcome()  # 获得欢迎信息 
ftp.cwd('file/test')    # 设置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服务器

我写了两个函数,分别实现上传和下载功能。请看完整代码:

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

import os
import ftplib
import socket


# 上传指定文件到 ftp 服务器
def uploadFile(dir_ftp, filename_ftp, filepath_local, host, port, username, password):
    """
    参数说明:
    * dir_ftp: 在 ftp 服务器上存储文件的路径;
    * filename_ftp: 存储到 ftp 服务器上的文件名;
    * filepath_local: 需要上传的本地源文件路径;
    * host: ftp 服务器地址(ip/域名);
    * port: ftp 服务器端口号,一般是 21;
    * username、password: 登陆 ftp 服务器时的用户名和密码。
    """
    if not os.path.exists(filepath_local):
        print '找不到指定的源文件,请检查路径配置。'
        return False
    # connect
    try:
        f = ftplib.FTP()
        f.connect(host=host, port=port)
    except (socket.error, socket.gaierror), e:
        print '----ERROR:cannot reach ' + host
        print e
        return False
    # login
    try:
        f.login(user=username, passwd=password)
    except ftplib.error_perm, e:
        print '----ERROR:cannot login to server ' + host
        print e
        f.quit()
        return False
    print '****Logged in as ' + username + ' to server ' +host
    # change folder
    try:
        f.cwd(dir_ftp)
    except ftplib.error_perm, e:
        print '----ERROR:cannot CD to %s on %s' % (dir_ftp, host)
        print e
        f.quit()
        return False
    print '**** changed to %s folder on %s' % (dir_ftp, host)
    # upload file
    try:
        f.storbinary('STOR ' + filename_ftp, open(filepath_local, 'rb'))
    except ftplib.error_perm, e:
        print '----ERROR:cannot write %s on %s' % (filename_ftp, host)
        print e
        return False
    else:
        print '****Uploaded '+ filepath_local +' to '+ host +' as '\
            + os.path.join(dir_ftp, filename_ftp)
        f.quit()
        return True


# 登陆 ftp 服务器下载文件(保存到当前目录)
def getServerFile(dir_ftp, filename, host, port, username, password):
    """
    参数说明:
    * dir_ftp: 目标文件在 ftp 服务器上路径;
    * filename: 目标文件名;
    * host: ftp 服务器地址(ip/域名);
    * port: ftp 服务器端口号,一般是 21;
    * username、password: 登陆 ftp 服务器时的用户名和密码。
    """
    if os.path.exists(filename):
        print '****the file '+ filename +' has already exist! The file will be over writed'
    # connect
    try:
        f = ftplib.FTP()
        f.connect(host=host, port=port)
    except (socket.error, socket.gaierror), e:
        print '----ERROR:cannot reach ' + host
        print e
        return False
    # login
    try:
        f.login(user=username, passwd=password)
    except ftplib.error_perm, e:
        print '----ERROR:cannot login to server ' + host
        print e
        f.quit()
        return False
    print '****Logged in as ' + username + ' to server ' +host
    # change folder
    try:
        f.cwd(dir_ftp)
    except ftplib.error_perm, e:
        print '----ERROR:cannot CD to %s on %s' % (dir_ftp, host)
        print e
        f.quit()
        return False
    print '**** changed to %s folder on %s' % (dir_ftp, host)
    # get file
    try:
        f.retrbinary('RETR %s' % filename, open(filename, 'wb').write)
    except ftplib.error_perm, e:
        print '----ERROR:cannot read file %s on %s' % (filename, host)
        print e
        os.unlink(filename)
        return False
    else:
        print '****Downloaded '+ filename +' from '+ host +' to ' + os.getcwd()
        f.quit()
        return True
if __name__ == "__main__":
    # 下载
    getServerFile("/ftptest", "words.txt", "ftpserver.xxxxxx.com", 21, "zhangsan", "iloveu")

    # 上传
    uploadFile("/ftptest", "upload_demo.txt", "words.txt", "ftpserver.xxxxxx.com", 21, "zhangsan", "iloveu")
    print '****done'

 

参考文章:Python:FTP上传和下载文件编程