python ftp下载上传文件或文件夹

2023-05-16

目录

1、包引用

2、函数说明

2.1、连接登录

2.2、常规操作指令(对标linux指令)

2.3、上传文件

2.4、下载文件

2.5、退出        


        实际需要,编写一个脚本,通过ftp下载文件或这文件夹。

1、包引用

        使用python自带的包ftplib。

from ftplib import FTP

        添加对中文路径的支持:

代码里头设置下 ftp.encoding = 'utf-8' 

        否则,遇到中文路径会报错:

UnicodeEncodeError: 'latin-1' codec can't encode characters in position 24-25: ordinal not in range(256)

        也可以在python.exe目录下的Lib文件夹下,找到ftplib.py,更改编码:

2、函数说明

2.1、连接登录

        登录需要配置参数:ftp_ip、ftp_port、ftp_user、ftp_password。

ftp = FTP() ftp.connect(ftp_ip, ftp_port) # 连接ftp 
ftp.login(ftp_user, ftp_password) # ftp登录 
print(ftp.getwelcome()) # 查看欢迎信息

        成功则打印:

220 Serv-U FTP Server v15.0 ready...

2.2、常规操作指令(对标linux指令)

ftp.cwd(path)  # 进入目录:cd
ftp.pwd()      # 返回当前目录路径:pwd
ftp.dir()      # 显示目录下所有信息:ls -alh
ftp.nlst()     # 获取目录下文件名列表: ls    => ['file1', 'file2',...]
ftp.mkd(directory)    # 新建远程目录: mkdir(directory)
ftp.rmd(directory)    # 删除远程目录: rm -rf directory
ftp.delete(file_name) # 删除远程文件: rm file_name
ftp.rename(old, new)  # 将远程文件old重命名为new: mv old new

2.3、上传文件

        上传文件,cmd是一个存储命令,可以为"STOR filename.txt", fp为类文件对象(有read方法),bufsize设置缓冲大小。

ftp.storbinary(cmd, fp, bufsize)

2.4、下载文件

        下载文件,cmd是一个获取命令,可以为"RETR filename.txt", callback是一个回调函数,用于读取获取到的数据块

ftp.retrbinary(cmd, callback, bufsize)

2.5、退出        

ftp.quit() # 退出连接

 3、示例测试

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

import os
import re
import ftplib


class MyFtp(object):
    """
    Ftp上传下载接口类
    """
    conn = ftplib.FTP()

    def __init__(self, host, port=21):
        self.conn.connect(host, port)
        self.conn.encoding = "utf-8"  # "GB2312"
        # self.conn.set_debuglevel(2)  # 打开调试级别2,显示详细信息
        # self.conn.set_pasv(True) # 0 主动模式 1 #被动模式

    def login(self, user, passwd):
        """
        登录
        :param user: 用户名
        :param passwd: 密码
        :return: 返回self,支持链试调用
        """
        self.conn.login(user, passwd)
        print(self.conn.welcome)
        return self

    def close(self):
        self.conn.quit()

    def download_file(self, local_file, remote_file):
        """
        下载单个文件,将 remote_file 下载到 local_file。
        :param local_file: 本地文件地址
        :param remote_file: 远程目录文件地址
        :return: 是否成功标志
        """

        ret = True
        try:
            file_handler = open(local_file, "wb")
            self.conn.retrbinary("RETR " + remote_file, file_handler.write)
            file_handler.close()
        except Exception as err:
            ret = False
            print("file down load err:", err)
        return ret

    def download_dir(self, local_dir, remote_dir, filter=""):  # 下载文件夹
        """
        下载单个文件,将 remote_dir 下载到 local_dir。
        :param local_dir: 本地文件夹地址
        :param remote_dir: 远程目录文件夹地址
        :param filter: 正则过滤器
        :return: 是否成功标志
        """

        print("远程文件夹 remote_dir:", remote_dir)
        if not os.path.exists(local_dir):
            os.makedirs(local_dir)

        self.conn.cwd(remote_dir)
        remote_names = self.conn.nlst()
        if 0 == len(remote_names):
            print("远程文件目录:", remote_names)
            return False

        for file in remote_names:
            local = os.path.join(local_dir, file)
            print("正在下载", self.conn.nlst(file))
            if file.find(".") == -1:  # 子文件夹递归
                if not os.path.exists(local):
                    os.makedirs(local)
                self.download_dir(local, file)
            else:
                if filter and not re.search(filter, file):
                    continue
                self.download_file(local, file)
        self.conn.cwd("..")
        return True

    def list_dir(self, remote_dir, filter=None, real_path=False):
        org_dir = self.conn.pwd()
        self.conn.cwd(remote_dir)
        file_names = self.conn.nlst()

        if filter is not None:
            file_names = [v for v in file_names if re.search(filter, v)]
        if real_path:
            file_names = [os.path.join(remote_dir, v) for v in file_names]

        self.conn.cwd(org_dir)
        return file_names

    def put_file(self, local_file, remote_path="."):
        """
        上传文件。如果远程路径是个目录,则上传文件到这个目录,文件名不变;
                 如果远程路径的上层是个目录,则上传文件,文件名按照给定命名。
        :param local_file: 本地文件
        :param remote_path: 远程目录或文件
        :return: 是否成功标志
        """

        ret = True
        ftp_path = remote_path.rstrip('/')
        if os.path.isfile(local_file):
            file_handler = open(local_file, 'rb')
            local_file_name = os.path.basename(local_file)

            # 如果远程路径是个目录,则上传文件到这个目录,文件名不变
            if self._is_ftp_dir(ftp_path):
                self.conn.storbinary('STOR %s' % os.path.join(ftp_path, local_file_name), file_handler)

            # 如果远程路径的上层是个目录,则上传文件,文件名按照给定命名
            elif self._is_ftp_dir(os.path.dirname(ftp_path)):
                print('STOP %s' % ftp_path)
                self.conn.storbinary('STOR %s' % ftp_path, file_handler)
            # 如果远程路径不是目录,且上一层的目录也不存在,则提示给定远程路径错误
            else:
                ret = False
                print('STOR %s' % ftp_path, file_handler)
        return ret

    def put_dir(self, local_dir, remote_dir=".", begin=True):
        """
        上传文件夹
        :param local_dir: 本地文件夹
        :param remote_dir: 远程文件夹
        :param begin:
        :return: 是否成功标志
        """

        ftp_path = remote_dir.rstrip('/')
        if not os.path.isdir(local_dir):
            print('ERROR:The dir:%s is not exist' % local_dir)
            return False

        # 当本地目录存在时上传
        # 上传初始化:如果给定的ftp路径不存在需要创建,同时将本地的目录存放在给定的ftp目录下。
        # 本地目录下文件存放的路径为ftp_path = ftp_path + os.path.basename(local_path)
        # 例如,将本地的文件夹a上传到ftp的a/b目录下,则本地a目录下的文件将上传的ftp的a/b/a目录下
        if begin:
            if not self._is_ftp_dir(ftp_path):
                try:
                    self.conn.mkd(ftp_path)
                except Exception as e:
                    print(e)
            ftp_path = os.path.join(ftp_path, os.path.basename(local_dir))

        # 如果上传路径是文件夹,则创建目录
        if not self._is_ftp_dir(ftp_path):
            try:
                self.conn.mkd(ftp_path)
            except Exception as e:
                print(e)

        # 进入本地目录,开始递归查询
        os.chdir(local_dir)
        local_files = os.listdir('.')
        for file in local_files:
            ftp_file = os.path.join(ftp_path, file)
            # 如果file本地路径是目录则递归上传文件(不需要再进行初始化begin的标志修改为False)
            # 如果file本地路径是文件则直接上传文件
            if os.path.isdir(file):
                self.put_dir(file, ftp_file, False)
            elif "idea" in file:
                pass
            else:
                self.put_file(file, ftp_path)

        # 如果当前本地目录文件已经遍历完毕返回上一层目录
        os.chdir('..')

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python ftp下载上传文件或文件夹 的相关文章

随机推荐

  • 服务器主板cpld芯片作用,CPLD的工作原理是什么呢?

    CPLD 复杂可编程逻辑器件 xff0c 它是从PAL和GAL器件发展出来的器件 xff0c 相对而言规模大 xff0c 结构复杂 xff0c 属于大规模集成电路范围 它的工作方式和原理与FPGA 现场可编程门阵列 相类似 xff0c 都是
  • 服务器维护 灵魂兽,魔兽世界7.0新灵魂兽麋鹿捕捉方法

    可盘游戏BT盒子是一款功能十分强大的游戏福利软件 xff0c 这里汇聚了全网最热门最好玩的手游 大家不仅可以在这里获得各种折扣福利 xff0c 还能下载游戏 类型 xff1a 辅助工具 大小 xff1a 17 42M 语言 xff1a 简体
  • 换热站无线通讯服务器,供暖换热站的手机APP智能调控研究

    摘要 xff1a 我国目前集中供热需求量较大 每年消耗大量的煤炭 电力 根据2014年统计数据 我国集中供热能耗平均在20至25公斤标煤 m 2 而欧洲为10至15公斤标煤 m 2 1 可见 我国集中供热能耗高出同纬度甚至更高纬度的欧洲国家
  • 虚拟主机ip和服务器ip一样,虚拟主机独立ip和服务器的独立ip区别-

    虚拟从机独立ip和办事器的独立ip区别是什么 xff1f 从IP利用上来看 xff0c 虚拟从机分派的独立IP和办事器的独立IP并没无什么区别 xff0c 都是一样的拜候感化 虽然虚拟从机是从办事器上划分出来的一部门空间 xff0c 不外度
  • TX2系统镜像制作及烧写

    可以通过制作镜像的方法来快速复制板子的环境 xff0c 达到快速部署的目的 tx2系列资源总目录地址 xff1a https blog csdn net weixin 34910922 article details 106933180 P
  • tx2刷机-安装环境

    tx2系列资源总目录地址 xff1a https blog csdn net weixin 34910922 article details 106933180 1 解压 Linux Driver Package xff0c 生成文件夹目录
  • TX2下查看CPU GPU 内存使用率

    声明 xff1a 文章仅作知识整理 分享 xff0c 如有侵权请联系作者删除博文 xff0c 谢谢 xff01 tx2系列资源总目录地址 xff1a https blog csdn net weixin 34910922 article d
  • onnxsim-让导出的onnx模型更精简

    用torch导出的模型有时候参数过多 xff0c 不利于查看 查找资料onnxsim可以简化模型 xff0c 让显示更加自然 如 xff0c reshap层的导出 xff0c 红框中细节参数被显示出现 默认导出 xff1a 使用onnxsi
  • conda国内源-持续更新

    清华源 中科大源大部分时间能用 xff0c 但没事也会被封 最近发现的北外源挺好用 推荐使用 xff1a 北外镜像 xff08 推荐 xff09 xff1a conda config add channels https mirrors b
  • (三)PX4在gazebo中仿真障碍物检查与路径规划【完全SIL】

    首先完成 ROS PX4 firmware gazebo的环境配置 可以参考上一篇博客 二 PX4编译与gazebo仿真环境的搭建 ubuntu14 amp ubuntu16 安装 障碍物检测与路径规划的一些依赖库 span class h
  • python使用tcp传输图像

    使用tcp进行图像网络收发 主要分为两个部分 xff1a 1 服务端 step1 启动服务 xff0c 等待客户端连接 xff1b step2 等待并接受客户端数据 xff1b step3 接收的二进制流解码 xff0c 显示 xff1b
  • apt-get install 报错:无法修正错误,因为您要求某些软件包保持现状,就是它们破坏了软件包间的依赖关系

    sudo apt get install安装软件时 xff0c 出现错误 无法修正错误 xff0c 因为您要求某些软件包保持现状 xff0c 就是它们破坏了软件包间的依赖关系 提示已经很明显了 xff0c 依赖关系问题 百度后 xff0c
  • 数据增强(Data Augmentation)常用方法汇总

    1 数据增强的作用 1 xff09 避免过拟合 当数据集具有某种明显的特征 xff0c 例如数据集中图片基本在同一个场景中拍摄 xff0c 使用Cutout方法和风格迁移变化等相关方法可避免模型学到跟目标无关的信息 2 xff09 提升模型
  • uint8_t和char的相互转换

    uint8 t 和char 的相互转换以及uint8 t 和int16 t 的相互转换 实际应用需要 xff0c 实现uint8 int16 t int32 t的按字节传输 xff0c 实现发送和接收功能 如int16 t xff0c 需要
  • c++ sleep函数头文件

    c 43 43 11标准 xff0c 提供线程休眠函数 xff1a using namespace std chrono literals std this thread sleep for 5 线程休眠5ms 1 windows下支持 x
  • shell指令自带sudo密码

    希望在sh脚本文件中的shell指令中使用sudo命令 xff0c 需要自动输入密码以确保顺序执行 有两种方式可以实现 xff1a 1 将密码以参数形式追加到脚本 使用管道 xff1a echo 密码 sudo S shell命令 如 xf
  • qt 线程同步-互斥量(Qmutex)

    在多线程应用程序中 xff0c 由于多个线程的存在 xff0c 线程之间可能需要访问同一个变量 xff0c 或一个线程需要等待另外一个线程完成某个操作后才产生相应的动作 xff0c 这时候就需要做线程同步 所以 xff0c 需要线程同步情况
  • qt下使用opencv读取视频

    测试环境 xff1a ubuntu18 04 43 opencv4 2 43 Qt 一个基础的opencv读取视频并显示demo video pro文件 xff1a SOURCES 43 61 main cpp INCLUDEPATH 43
  • KITTI数据集下载链接

    1 简介 KITTI数据集由德国卡尔斯鲁厄理工学院和丰田美国技术研究院联合创办 xff0c 是目前国际上最大的自动驾驶场景下的计算机视觉算法评测数据集 该数据集用于评测立体图像 stereo xff0c 光流 optical flow xf
  • python ftp下载上传文件或文件夹

    目录 1 包引用 2 函数说明 2 1 连接登录 2 2 常规操作指令 xff08 对标linux指令 xff09 2 3 上传文件 2 4 下载文件 2 5 退出 实际需要 xff0c 编写一个脚本 xff0c 通过ftp下载文件或这文件