Python 连接FTP服务器并实现文件夹下载实例演示,python区分ftp目录下文件和文件夹方法,ftp目录下包含中文名问题处理
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目录下包含中文名问题处理相关推荐
- linux上连接ftp服务器,linux下lftp连接ftp服务器进行上传与下载的方法详解
摘要 腾兴网为您分享:linux下lftp连接ftp服务器进行上传与下载的方法详解,中英翻译,中建在线,掌上看家,银行帮等软件知识,以及微信一键转发工具,小学英语冀教版,正是在下表情包,易问电信,万能 ...
- Python 操作Word文档插入图片和表格实例演示
Python 操作Word文档插入图片和表格实例演示 效果图 实现过程 ① python-docx 库安装 ② word 文档插入图片演示 ③ word 文档插入表格演示 [ 文章推荐 ] Pytho ...
- [CentOs7]搭建ftp服务器(3)——上传,下载,删除,重命名,新建文件夹
摘要 上篇文章介绍了如何为ftp添加虚拟用户,本篇将继续实践如何上传,下载文件. 上传 使用xftp客户端上传文件,如图所示 此时上传状态报错,查看详情 从错误看出是应为无法创建文件造成的.那么我们就 ...
- python连接linux服务器读取txt文件_python 读取Linux服务器上的文件方法
使用Python语句,读取Linux远端服务器上的文件打印到控制台的代码实现: 下载包:paramiko import paramiko #服务器信息,主机名(IP地址).端口号.用户名及密码 hos ...
- python连接linux服务器并使用命令_python基于paramiko模块实现远程连接Linux虚拟机(服务器)并执行指定命令返回输出结果...
对于开发者来说,windows是我们接触最多的操作系统了,但是Linux是我们必不可少的一项重要技能,很多服务或者应用都需要在Linux下运行,掌握Linux系统的基本使用也是非常重要的,今天有一个需 ...
- FTP服务器的上传与下载
强烈推荐一个大神的人工智能的教程:http://www.captainbed.net/zhanghan 前言 这是前三周的事情了,拿到现在来总结真是惭愧了,某个周四把任务都做完了,看了会代码有点乏了, ...
- python连接hive kerberos_【华为云技术分享】使用Python连接Kerberos的Presto
Python连接presto开源提供了以下两个库可以使用 接下来就来分别实践一下,这两种客户端. 环境准备 1. 创建一台Ubuntu的ECS,VPC选择和MRS集群一致 2. ...
- python中返回上一步操作_通过实例解析Python文件操作实现步骤
当程序运行时,变量是保存数据的好方法,但变量.序列以及对象中存储的数据是暂时的,程序结束后就会丢失,如果希望程序结束后数据仍然保持,就需要将数据保存到文件中. Python 提供了内置的文件对象,以及 ...
- python编程和c语言编程的区别-通过实例浅析Python对比C语言的编程思想差异
我一直使用 Python,用它处理各种数据科学项目. Python 以易用闻名.有编码经验者学习数天就能上手(或有效使用它). 听起来很不错,不过,如果你既用 Python,同时也是用其他语言,比如说 ...
最新文章
- MFC的类层次结构图
- 【数据结构与算法】之深入解析“课程表III”的求解思路与算法示例
- 机器学习中的算法-支持向量机(SVM)基础
- C#LeetCode刷题之#118-杨辉三角(Pascal‘s Triangle)
- Hive中Database、Table的创建与查询
- java 数组有序_Java有序数组
- Ubutun16.04安装和使用daemontools
- 计算机网络实验水晶头,计算机网络实验报告制作网线
- compositionAPI
- MATLAB基本操作之画图
- Linux usb 5. usbip (USB Over IP) 使用实例
- mac下的insert键
- 【Python】京东自动下单抢购脚本——双十一购物小技巧
- 王 第潜艇三天 引用类型 继承
- jQuery带缩略图轮播效果图片切换带缩略图
- ps快捷图标在哪个文件夹_我下载了ps图片编辑器但没有快捷图标怎么办
- 一个北漂女程序员的心中梦想
- 删除 13k 行暂存代码后,Linux 5.19 轻装上阵
- GBDT,XGBoost和LightBoost对比
- 【打卡】21天学习挑战赛—RK3399平台开发入门到精通-day9
热门文章
- 通过poi操作ppt中的图片
- DIV+CSS中标签ul ol li dl dt dd用法
- Sql Server截断日志(转)
- 如何导出wince6.0的SDK
- IOS 粒子发射器,雪花落下、创建火焰、河流、蒸汽的动画效果源代码
- 《可穿戴创意设计:技术与时尚的融合》一一第2章 与可穿戴设备有关的故事...
- 某国家正在测试“关闭互联网”方法
- 《C++入门经典(第6版)》——1.5 问与答
- springweb拦截器
- 关于ListView顶部和底部滚(拖)动出现阴影解决方案