前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python 基于Python实现Ftp文件上传,下载

Python 基于Python实现Ftp文件上传,下载

作者头像
授客
发布2019-09-11 14:18:49
5.3K0
发布2019-09-11 14:18:49
举报
文章被收录于专栏:授客的专栏授客的专栏

测试环境:

Ftp客户端:Windows平台

Ftp服务器:Linux平台

Python版本:Python 2.7.6

实现功能:

支持FTP文件上传、下载,可以上传目录(分区除外),也可以上传单个文件;可以下载整个目录(/根目录除外),也可以下载单个文件

实践代码:

代码语言:javascript
复制
#!/usr/bin/env python
代码语言:javascript
复制
# -*- coding:utf-8 -*-
代码语言:javascript
复制
代码语言:javascript
复制
__author__ = 'shouke'
代码语言:javascript
复制
代码语言:javascript
复制
from ftplib import  FTP
代码语言:javascript
复制
import  ConfigParser
代码语言:javascript
复制
import os
代码语言:javascript
复制
代码语言:javascript
复制
class MyFTP:
代码语言:javascript
复制
    def __init__(self, ftp_conf):
代码语言:javascript
复制
        '''ftp服务器主机IP,端口等配置'''
代码语言:javascript
复制
        config = ConfigParser.ConfigParser()
代码语言:javascript
复制
        config.read(ftp_conf)
代码语言:javascript
复制
代码语言:javascript
复制
        self.ftp_host = config.get('FTP', 'ftp_host')
代码语言:javascript
复制
        self.ftp_port = config.get('FTP', 'ftp_port')
代码语言:javascript
复制
        self.ftp_user = config.get('FTP', 'ftp_user')
代码语言:javascript
复制
        self.ftp_passwd = config.get('FTP', 'ftp_passwd')
代码语言:javascript
复制
        self.ftp = FTP()
代码语言:javascript
复制
代码语言:javascript
复制
代码语言:javascript
复制
    def get_ftp_host(self):
代码语言:javascript
复制
        return self.ftp_host
代码语言:javascript
复制
代码语言:javascript
复制
    def get_ftp_port(self):
代码语言:javascript
复制
        return self.ftp_port
代码语言:javascript
复制
代码语言:javascript
复制
    def get_ftp_user(self):
代码语言:javascript
复制
        return self.ftp_user
代码语言:javascript
复制
代码语言:javascript
复制
    def get_ftp_passwd(self):
代码语言:javascript
复制
        return self.ftp_passwd
代码语言:javascript
复制
代码语言:javascript
复制
    # 连接到ftp服务器
代码语言:javascript
复制
    def connect(self):
代码语言:javascript
复制
        print('is connecting to ftp server %s on %s' % (self.ftp_host, self.ftp_port))
代码语言:javascript
复制
        self.ftp.connect(self.ftp_host, self.ftp_port)
代码语言:javascript
复制
代码语言:javascript
复制
    # 登陆到ftp服务器
代码语言:javascript
复制
    def login(self):
代码语言:javascript
复制
        print('ready to login ftp server')
代码语言:javascript
复制
        self.ftp.login(self.ftp_user, self.ftp_passwd)
代码语言:javascript
复制
        print('login ftp server successfully')
代码语言:javascript
复制
        print(self.ftp.getwelcome())
代码语言:javascript
复制
代码语言:javascript
复制
    # 友好的关闭连接
代码语言:javascript
复制
    def quit(self):
代码语言:javascript
复制
        try:
代码语言:javascript
复制
            self.ftp.quit()
代码语言:javascript
复制
            print('colose ftp connection successfully')
代码语言:javascript
复制
        except Exception as e:
代码语言:javascript
复制
            print('%s' % e)
代码语言:javascript
复制
代码语言:javascript
复制
    # 上传文件夹
代码语言:javascript
复制
    def upload_folder(self, local_path='../screenshot_lib', remote_path='/home/testacc'):
代码语言:javascript
复制
        if not os.path.isdir(local_path):
代码语言:javascript
复制
            print('出错了,请选择要上传的文件夹')
代码语言:javascript
复制
            return
代码语言:javascript
复制
        local_path = local_path.strip() # 以防万一,去除首尾空格
代码语言:javascript
复制
        local_path = local_path.rstrip('/') # 去除右部 /
代码语言:javascript
复制
        local_path = local_path.rstrip('\\') # 去除右部 \\
代码语言:javascript
复制
        remote_path = remote_path.strip()
代码语言:javascript
复制
        remote_path = remote_path.rstrip('/')
代码语言:javascript
复制
        remote_path = remote_path.rstrip('\\')
代码语言:javascript
复制
代码语言:javascript
复制
        self.ftp.cwd(remote_path)
代码语言:javascript
复制
代码语言:javascript
复制
        last_dir = os.path.basename(local_path)
代码语言:javascript
复制
        remote_path = os.path.join(remote_path, last_dir)
代码语言:javascript
复制
        remote_path = remote_path.replace('\\', '/') # 转为linux标准路径
代码语言:javascript
复制
        # 如果ftp服务器上不存在该路径,则创建对应路径下的目录
代码语言:javascript
复制
        try:
代码语言:javascript
复制
            self.ftp.mkd(last_dir)
代码语言:javascript
复制
        except:
代码语言:javascript
复制
            #print('dir: %s already exists' % last_dir)
代码语言:javascript
复制
            pass
代码语言:javascript
复制
代码语言:javascript
复制
        sub_items = os.listdir(local_path)
代码语言:javascript
复制
        for sub_item in sub_items:
代码语言:javascript
复制
            sub_item_path = os.path.join(local_path, sub_item)
代码语言:javascript
复制
            if os.path.isdir(sub_item_path): #如果子项目为目录
代码语言:javascript
复制
                self.upload_folder(sub_item_path, remote_path)
代码语言:javascript
复制
            else:
代码语言:javascript
复制
                self.upload_file(sub_item_path, remote_path)
代码语言:javascript
复制
代码语言:javascript
复制
    # 上传文件
代码语言:javascript
复制
    def upload_file(self, src_file_path, remote_path):
代码语言:javascript
复制
        remote_file_name = os.path.split(src_file_path)[1]
代码语言:javascript
复制
        remote_path = remote_path + '/' + remote_file_name
代码语言:javascript
复制
        try: #如果文件不存在,调用file.size(filename)会报错
代码语言:javascript
复制
            if self.ftp.size(remote_path) != None:
代码语言:javascript
复制
                print("文件%s已存在" % remote_path)
代码语言:javascript
复制
                return
代码语言:javascript
复制
        except Exception as e:
代码语言:javascript
复制
            pass
代码语言:javascript
复制
代码语言:javascript
复制
        with open(src_file_path, 'rb') as file_handler:
代码语言:javascript
复制
             self.ftp.storbinary('STOR %s' % remote_path , file_handler)
代码语言:javascript
复制
             print('文件:%s 已经上传到ftp' % src_file_path)
代码语言:javascript
复制
代码语言:javascript
复制
代码语言:javascript
复制
    # 下载目录
代码语言:javascript
复制
    def download_dir(self,local_path, remote_path):
代码语言:javascript
复制
        if os.path.isfile(local_path):
代码语言:javascript
复制
            print('出错了,请选择文件保存位置')
代码语言:javascript
复制
            return
代码语言:javascript
复制
        local_path = local_path.strip() # 以防万一,去除首尾空格
代码语言:javascript
复制
        remote_path = remote_path.strip()
代码语言:javascript
复制
        remote_path = remote_path.rstrip('/')
代码语言:javascript
复制
        remote_path = remote_path.rstrip('\\')
代码语言:javascript
复制
代码语言:javascript
复制
        last_dir = os.path.basename(remote_path)
代码语言:javascript
复制
        local_path = os.path.join(local_path, last_dir)
代码语言:javascript
复制
        local_path = local_path.replace('/', '\\') # 转为Windows标准路径
代码语言:javascript
复制
        # 如果本地客户端不存在该路径,则创建对应路径下的目录
代码语言:javascript
复制
        if not os.path.isdir(local_path):
代码语言:javascript
复制
            os.mkdir(local_path)
代码语言:javascript
复制
代码语言:javascript
复制
        sub_items = self.ftp.nlst(remote_path)
代码语言:javascript
复制
        for sub_item in sub_items:
代码语言:javascript
复制
            try:
代码语言:javascript
复制
                self.ftp.cwd(sub_item) #如果子项目为目录
代码语言:javascript
复制
                self.download_dir(local_path, sub_item)
代码语言:javascript
复制
            except Exception: # 非目录
代码语言:javascript
复制
                self.download_file(local_path, sub_item)
代码语言:javascript
复制
代码语言:javascript
复制
    def download_file(self, local_path, remote_file_path):

if os.path.isdir(local_file_path):

代码语言:javascript
复制
             print('请选择文件保存目录路径')

             return
        



        last_file_name = os.path.split(remote_file_path)[1]
代码语言:javascript
复制
        local_file_path = os.path.join(local_path, last_file_name)
代码语言:javascript
复制
        if os.path.isfile(local_file_path):
代码语言:javascript
复制
            local_file_path = local_file_path.replace('\\', '/')
代码语言:javascript
复制
            print('文件:%s 已存在' % local_file_path)
代码语言:javascript
复制
            return
代码语言:javascript
复制
代码语言:javascript
复制
        with open(local_file_path, 'wb') as file_handle:
代码语言:javascript
复制
            self.ftp.retrbinary('RETR %s' % remote_file_path, file_handle.write)
代码语言:javascript
复制
代码语言:javascript
复制
if __name__ == '__main__':
代码语言:javascript
复制
    ftp = MyFTP('./config/ftp.conf')
代码语言:javascript
复制
    ftp.connect()
代码语言:javascript
复制
    ftp.login()
代码语言:javascript
复制
    ftp.upload_folder()
代码语言:javascript
复制
    ftp.upload_folder('E:\\dir1')
代码语言:javascript
复制
    # ftp.upload_folder('E:\\dir1\\')
代码语言:javascript
复制
    # ftp.upload_folder('E:/dir1/')
代码语言:javascript
复制
    # ftp.download_dir('E:\\', '/home/testacc')
代码语言:javascript
复制
    # ftp.download_dir('E:/', '/home/testacc')
代码语言:javascript
复制
    ftp.download_file('E:\\', '/home/testacc/testfile')
代码语言:javascript
复制
    ftp.quit()
代码语言:javascript
复制
代码语言:javascript
复制
ftp.conf配置如下:
代码语言:javascript
复制
[FTP]
代码语言:javascript
复制
ftp_host = 192.168.1.103
代码语言:javascript
复制
ftp_port = 21
代码语言:javascript
复制
ftp_user = testacc
代码语言:javascript
复制
ftp_passwd = testacc
代码语言:javascript
复制

测试数据如下:

Python <wbr>基于Python实现Ftp文件上传,下载
Python <wbr>基于Python实现Ftp文件上传,下载
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2015-12-21 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档