目录

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-8import os
import re
import ftplibclass 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 selfdef 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 = Truetry:file_handler = open(local_file, "wb")self.conn.retrbinary("RETR " + remote_file, file_handler.write)file_handler.close()except Exception as err:ret = Falseprint("file down load err:", err)return retdef 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 Falsefor 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):continueself.download_file(local, file)self.conn.cwd("..")return Truedef 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_namesdef put_file(self, local_file, remote_path="."):"""上传文件。如果远程路径是个目录,则上传文件到这个目录,文件名不变;如果远程路径的上层是个目录,则上传文件,文件名按照给定命名。:param local_file: 本地文件:param remote_path: 远程目录或文件:return: 是否成功标志"""ret = Trueftp_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 = Falseprint('STOR %s' % ftp_path, file_handler)return retdef 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:passelse:self.put_file(file, ftp_path)# 如果当前本地目录文件已经遍历完毕返回上一层目录os.chdir('..')

python ftp下载上传文件或文件夹相关推荐

  1. 文件已上传服务器去哪找,ftp文件服务器上传后的文件在哪

    ftp文件服务器上传后的文件在哪 内容精选 换一换 FTP/SFTP连接适用于从线下文件服务器或ECS服务器上迁移文件到OBS或数据库.当前仅支持Linux操作系统的FTP 服务器.连接FTP或SFT ...

  2. python 通过ftp自动 上传指定excel文件

    #!/usr/bin/python # -*- coding: UTF-8 -*- from ftplib import FTP import sys import time import socke ...

  3. QT5通过FTP下载上传文件

    Qt5之后需要用QNetworkAccessManager实现FTP,且只有上传和下载功能.

  4. 快速下载/上传google drive文件的方法

    MultiCloud:无需下载和安装,在网页登录即可将文件上传到云盘或下载到计算机上,支持30多种云盘. 以将google drive 上的文件下载到本地计算机为例. 注册并登录MultCloud. ...

  5. python requests 发送 上传 多个文件

    目录 1.上传文件 代码实例 2.files参数 字典类型 3.files参数 元组列表类型 1.上传文件 代码实例 在requests中发送文件的接口只有一种,那就是使用requests.post的 ...

  6. python连接ftp并上传、下载文件

    # -*- coding:utf-8 -*- """ Created on 2019年12月11日 :封装FTP文件上传与下载函数 @author: dch " ...

  7. ftp 追加远程文件_ftp上传,完成ftp定时上传、下载只需3步

    FTP[File Transfer Protocol]中文译为文件传输协议,是Internet上的另一项主要服务,这项服务让使用者能通过Internet来传输各式各样的文件.FTP上传是与WEB上传相 ...

  8. Linux 终端访问 FTP 及 上传下载 文件

    今天同事问我一个问题,在Linux 下访问FTP,并将文件上传上去. 我之前一直是用WinSCP工具的. 先将文件从linux copy到windows下,然后在传到ftp上. google 一下. ...

  9. Linux 终端訪问 FTP 及 上传下载 文件

    今天同事问我一个问题,在Linux 下訪问FTP,并将文件上传上去. 我之前一直是用WinSCP工具的. 先将文件从linux copy到windows下,然后在传到ftp上. google 一下. ...

  10. Perl之 用Net::FTP来上传下载文件

    2011-04-23 22:46:49 在Perl中,使用模块Net::FTP来使用FTP服务,一般的使用步骤如下: 使用Net::FTP的new方法来创建一个新的FTP对象. 使用login方法登录 ...

最新文章

  1. toolkit,phonetextbox中实现用户按回车键会换行
  2. Spring JDBC的学习
  3. NLP深度学习:近期趋势概述(一)
  4. 用java servlet Filter编写过滤器
  5. 高性能服务器机柜,TS系列网络服务器机柜
  6. eval() python_如何使用 Python 编写 vim 插件
  7. jdbc 数据源_Java数据源,JDBC数据源示例
  8. oracle经纬度换算成xy坐标,xy坐标转换经纬度【处置步骤】
  9. linux socket 阻塞服务端 非阻塞客户端,Linux socket非阻塞connect方法
  10. swf播放器air android 版,网极SWF播放器安卓版
  11. Android 之简易涂鸦板
  12. linux系统编程之进程通信
  13. 基于B/S模式的设备管理系统开发
  14. 使用ubuntu遇到的问题-An error occurred,please run Package Manager...
  15. 关于Springboot定时任务
  16. MTK优美代码赏析2:MenuItemMask_flag
  17. |app自动化测试之Appium问题分析及定位
  18. 手机端宝贝描述中每张图片的宽要在480到1500之间,最大高度为2500, 以下图片不满足
  19. matlab建立学生档案,matlab程序设计入门20PPT18档案读写 .pptx
  20. Paging内部原理

热门文章

  1. 【Python实战系列】串口实时接收数据并基于pyqtgraph绘图
  2. 泰格如何修改服务器地址,[问题求助-网络迁移] 【昇腾公有云服务器】【ATC转换工具】在华为昇腾公有云服务器上使用ATC命令PB转OM模型失败...
  3. 清华大学计算机直硕生,推免数据 | 清华大学计算机系三大巨变——直硕生减半,本校增多,211增多...
  4. week7-学习写技术交底书的所得
  5. GitLab迁移升级大作战
  6. TeamTalk 服务器代码分析
  7. 微信公众号模板消息推送
  8. Postman下载安装
  9. UVa1543.圆和多边形+UVa12063.零和一(动态规划)
  10. 计算机声音管理器不见了,电脑中找不到Realtek高清晰音频管理器的解决方法