Python 连接 FTP 服务器并实现文件夹下载实例演示

  • 第一章:连接 FTP 服务器并实现文件夹下载
  • ① 连接 FTP 服务器
  • ② 进入指定目录并显示文件信息
  • ③ 区分文件和文件夹名
  • ④ 文件夹名包含空格处理
  • ⑤ 使用递归实现:FTP服务器里的文件夹下载到本地
  • 第二章:问题解决
  • ① 下载的文件名包含中文【'utf-8' codec can't decode byte ...】
  • ② 指定的路径存在问题【550 The system cannot find the file specified.】
  • ③ 下载文件前未加RETR标识【500 Command not understood.】

[ 推荐文章 ]
Python 地图篇 - 使用 pyecharts 绘制世界地图、中国地图、省级地图、市级地图实例详解

第一章:连接 FTP 服务器并实现文件夹下载

① 连接 FTP 服务器

如果 FTP 不用用户名密码就直接可以访问,那就是用的默认用户名 Anonymous,密码为空。

# -*- coding: UTF8 -*-
# 2022-3-8
# 作者:小蓝枣
# python连接ftp服务器
from ftplib import FTPdef conn_ftp():'''作用:连接ftp服务器参数:无返回:ftp服务器连接的对象'''# FTP连接信息ftp_ip = "xx.xx.xx.xx"# 默认端口21ftp_port = 21# 如果未指定,使用默认用户名为Anonymous,密码为空ftp_user = "Anonymous"ftp_password = ""ftp = FTP()# 连接ftpftp.connect(ftp_ip, ftp_port)# ftp登录ftp.login(ftp_user, ftp_password)# 查看欢迎信息print(ftp.getwelcome())return ftpftp = conn_ftp()

② 进入指定目录并显示文件信息

方法 ftp.dir() 返回结果的结尾会默认带个 None,目录下没有内容的话直接会返回个 None

def display_dir(ftp, path):'''作用:进入并展示指定的目录内容参数1:ftp连接对象参数2:要展示的目录返回:无'''# 进入指定目录ftp.cwd(path)# 显示当前所在位置print("当前所在位置为:")print(ftp.pwd())# 展示目录内容print("\n显示目录内容:")print(ftp.dir())# 展示目录下的文件名,*文件夹和文件都会显示print("\n文件和文件夹名为:")for i in ftp.nlst():print(i)path = "/CaseData/nc.vo.sdp.testcase.testcase.TestcaseHVO/"
display_dir(ftp, path)

这是原始目录。

③ 区分文件和文件夹名

从上面方法 ftp.dir() 返回结果可以看到包含 <DIR> 标识的为文件夹,我们根据这个特征来进行文件夹区分。

def diff_dir(ftp, path):'''作用:区分文件和文件夹参数1:ftp连接对象参数2:要展示的目录返回:无'''# 进入指定目录ftp.cwd(path)# 显示当前所在位置print("当前所在位置为:")print(ftp.pwd())# 展示目录内容print("\n显示目录内容:")dirs = []ftp.dir(".", dirs.append)for i in dirs:# 区分文件和文件夹if("<DIR>" in i):print("目录为:" + i.split(" ")[-1])else:print("文件为:" + i.split(" ")[-1])path = "/CaseData/nc.vo.sdp.testcase.testcase.TestcaseHVO/"
diff_dir(ftp, path)

④ 文件夹名包含空格处理

split(" ")[-1] 方法有个缺陷,如果文件或文件夹名里包含空格,得到到的文件夹名就不对了,下面的方法可以有效的解决这个问题

def get_dir_name(s):'''作用:需要文件或文件夹名参数1:需要截取的字符串返回:文件或文件夹名'''dir_name = ""k = 0record = ""for i in s:if(record == " " and i != " "):k = k + 1;if(k >= 3):dir_name = dir_name + i;record = iprint(dir_name)return dir_name# 测试两条数据
get_dir_name("03-08-22  09:52AM       <DIR>          C2021.11_ZDHJC_004a")
get_dir_name("03-08-25  10:32AM                89098 hello .exe")

⑤ 使用递归实现:FTP服务器里的文件夹下载到本地

思路:
首先是看目录或文件里是否包含关键词,包含关键词进行下载。
并判断是否是目录,如果是目录的话,本地根据目录结构进行递归,同时本地创建文件夹。
使用了 2 个方法,下面的方法用来判断是否包含关键词,上面的方法就是目录结构下的递归。

注意:由于是一个 ftp 连接对象,递归过程中进去某个目录下,递归结束要回到之前的目录。

import pathlibdef download_dir(ftp, path, local_path):'''作用: 下载目录参数1:ftp连接对象参数2:要展示的目录参数3:本地存放路径返回:无'''# 进入指定目录ftp.cwd(path)# 区分文件和文件夹dirs = []ftp.dir(".", dirs.append)for i in dirs:try:# 识别为目录进行递归if("<DIR>" in i):dir_name = get_dir_name(i)local_path_new = local_path + "/" + dir_name# 本地创建文件夹pathlib.Path(local_path_new).mkdir(parents=True, exist_ok=True)# 调用下载目录方法download_dir(ftp, dir_name, local_path_new)# 识别为文件进行下载else:file_name = get_dir_name(i)local_filename = local_path + "/" + file_namef = open(local_filename, "wb")# 下载ftp文件ftp.retrbinary('RETR ' + file_name, f.write)f.close()except Exception as e:print(e)# 退出当前目录ftp.cwd("..")def download_file(ftp, key, path, local_path):'''作用: 根据关键词下载文件参数1:ftp连接对象参数2:下载的关键词参数3:要展示的目录参数4:本地存放路径返回:无'''# 进入指定目录ftp.cwd(path)# 区分文件和文件夹dirs = []ftp.dir(".", dirs.append)for i in dirs:if(key in i):try:# 识别为目录进行递归if("<DIR>" in i):dir_name = get_dir_name(i)local_path_new = local_path + "/" + dir_name# 本地创建文件夹pathlib.Path(local_path_new).mkdir(parents=True, exist_ok=True)# 调用下载目录方法download_dir(ftp, dir_name, local_path_new)else:file_name = get_dir_name(i)local_filename = local_path + "/" + file_namef = open(local_filename, "wb")# 下载ftp文件ftp.retrbinary('RETR ' + file_name, f.write)f.close()except Exception as e:print(e)# 设置编码,解决上传的文件包含中文的问题
ftp.encoding = 'GBK'
key = "C2021.11_ZDHJC"
path = "/CaseData/nc.vo.sdp.testcase.testcase.TestcaseHVO/"
local_path = "D:/ftp下载"
download_file(ftp, key, path, local_path)

可以看到符合关键词的目录被下载到本地了。

并且里面的嵌套目录也同步被下载了。

第二章:问题解决

① 下载的文件名包含中文【‘utf-8’ codec can’t decode byte …】

设置下 FTP 对象的编码为 GBK 即可。
ftp.encoding = 'GBK'
不然会报如下错误:UnicodeDecodeError: 'utf-8' codec can't decode byte 0xd7 in position 114: invalid continuation byte

② 指定的路径存在问题【550 The system cannot find the file specified.】

开始我用 split(" ")[-1] 方法截取文件名,由于有的文件含有中文,截取后的文件名称不对了。
就报了 ftplib.error_perm: 550 The system cannot find the file specified. 的错误。

③ 下载文件前未加RETR标识【500 Command not understood.】

下载文件时 FTP 路径前要加个 'RETR ',不然就会报 500 错误,注意后面还跟了个空格。

# 下载ftp文件
ftp.retrbinary('RETR ' + file_name, f.write)

不然就报 ftplib.error_perm: 500 Command not understood. 错误了。
喜欢的点个赞❤吧!

Python 连接FTP服务器并实现文件夹下载实例演示,python区分ftp目录下文件和文件夹方法,ftp目录下包含中文名问题处理相关推荐

  1. linux上连接ftp服务器,linux下lftp连接ftp服务器进行上传与下载的方法详解

    摘要 腾兴网为您分享:linux下lftp连接ftp服务器进行上传与下载的方法详解,中英翻译,中建在线,掌上看家,银行帮等软件知识,以及微信一键转发工具,小学英语冀教版,正是在下表情包,易问电信,万能 ...

  2. Python 操作Word文档插入图片和表格实例演示

    Python 操作Word文档插入图片和表格实例演示 效果图 实现过程 ① python-docx 库安装 ② word 文档插入图片演示 ③ word 文档插入表格演示 [ 文章推荐 ] Pytho ...

  3. [CentOs7]搭建ftp服务器(3)——上传,下载,删除,重命名,新建文件夹

    摘要 上篇文章介绍了如何为ftp添加虚拟用户,本篇将继续实践如何上传,下载文件. 上传 使用xftp客户端上传文件,如图所示 此时上传状态报错,查看详情 从错误看出是应为无法创建文件造成的.那么我们就 ...

  4. python连接linux服务器读取txt文件_python 读取Linux服务器上的文件方法

    使用Python语句,读取Linux远端服务器上的文件打印到控制台的代码实现: 下载包:paramiko import paramiko #服务器信息,主机名(IP地址).端口号.用户名及密码 hos ...

  5. python连接linux服务器并使用命令_python基于paramiko模块实现远程连接Linux虚拟机(服务器)并执行指定命令返回输出结果...

    对于开发者来说,windows是我们接触最多的操作系统了,但是Linux是我们必不可少的一项重要技能,很多服务或者应用都需要在Linux下运行,掌握Linux系统的基本使用也是非常重要的,今天有一个需 ...

  6. FTP服务器的上传与下载

    强烈推荐一个大神的人工智能的教程:http://www.captainbed.net/zhanghan 前言 这是前三周的事情了,拿到现在来总结真是惭愧了,某个周四把任务都做完了,看了会代码有点乏了, ...

  7. python连接hive kerberos_【华为云技术分享】使用Python连接Kerberos的Presto

    Python连接presto开源提供了以下两个库可以使用 接下来就来分别实践一下,这两种客户端. 环境准备 1.       创建一台Ubuntu的ECS,VPC选择和MRS集群一致 2.       ...

  8. python中返回上一步操作_通过实例解析Python文件操作实现步骤

    当程序运行时,变量是保存数据的好方法,但变量.序列以及对象中存储的数据是暂时的,程序结束后就会丢失,如果希望程序结束后数据仍然保持,就需要将数据保存到文件中. Python 提供了内置的文件对象,以及 ...

  9. python编程和c语言编程的区别-通过实例浅析Python对比C语言的编程思想差异

    我一直使用 Python,用它处理各种数据科学项目. Python 以易用闻名.有编码经验者学习数天就能上手(或有效使用它). 听起来很不错,不过,如果你既用 Python,同时也是用其他语言,比如说 ...

最新文章

  1. MFC的类层次结构图
  2. 【数据结构与算法】之深入解析“课程表III”的求解思路与算法示例
  3. 机器学习中的算法-支持向量机(SVM)基础
  4. C#LeetCode刷题之#118-杨辉三角(Pascal‘s Triangle)
  5. Hive中Database、Table的创建与查询
  6. java 数组有序_Java有序数组
  7. Ubutun16.04安装和使用daemontools
  8. 计算机网络实验水晶头,计算机网络实验报告制作网线
  9. compositionAPI
  10. MATLAB基本操作之画图
  11. Linux usb 5. usbip (USB Over IP) 使用实例
  12. mac下的insert键
  13. 【Python】京东自动下单抢购脚本——双十一购物小技巧
  14. 王 第潜艇三天 引用类型 继承
  15. jQuery带缩略图轮播效果图片切换带缩略图
  16. ps快捷图标在哪个文件夹_我下载了ps图片编辑器但没有快捷图标怎么办
  17. 一个北漂女程序员的心中梦想
  18. 删除 13k 行暂存代码后,Linux 5.19 轻装上阵
  19. GBDT,XGBoost和LightBoost对比
  20. 【打卡】21天学习挑战赛—RK3399平台开发入门到精通-day9

热门文章

  1. 通过poi操作ppt中的图片
  2. DIV+CSS中标签ul ol li dl dt dd用法
  3. Sql Server截断日志(转)
  4. 如何导出wince6.0的SDK
  5. IOS 粒子发射器,雪花落下、创建火焰、河流、蒸汽的动画效果源代码
  6. 《可穿戴创意设计:技术与时尚的融合》一一第2章 与可穿戴设备有关的故事...
  7. 某国家正在测试“关闭互联网”方法
  8. 《C++入门经典(第6版)》——1.5 问与答
  9. springweb拦截器
  10. 关于ListView顶部和底部滚(拖)动出现阴影解决方案