zoukankan      html  css  js  c++  java
  • Python 基于Python实现Ftp文件上传,下载

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

     

    by:授客 QQ1033553122

    测试环境:

    Ftp客户端:Windows平台

    Ftp服务器:Linux平台

    Python版本:Python 2.7.6

     

    实现功能:

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

     

    实践代码:

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

            if os.path.isdir(local_file_path):

                 print('请选择文件保存目录路径')
                 return        

           
    last_file_name = os.path.split(remote_file_path)[
    1]
            local_file_path = os.path.join(local_path, last_file_name)
    

     

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

    测试数据如下:

     


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

    pdf版本下载地址:基于Python实现Ftp文件上传,下载.pdf



  • 相关阅读:
    rollback
    引用类型(C# 参考)
    委托(C# 编程指南)
    解决“在证书存储区中找不到清单签名证书”
    C#语法——委托,架构的血液
    广东IP段列表
    mysql字段类型
    linux远程管理工具:putty
    SQL yog过期后教你怎么让他不过期
    js实现的美女瀑布流效果代码
  • 原文地址:https://www.cnblogs.com/shouke/p/10157819.html
Copyright © 2011-2022 走看看