【Python】ftp和sftp工具类,使用python实现文件的上传与下载

文章目录

  • 1. ftp工具类
  • 2. sftp工具类

1. ftp工具类

编写ftp工具类,我这里取名为 ftp_util.py

import os
from ftplib import FTPclass FtpUtil:def __init__(self, ip, username, password, port=21):self.ip = ipself.username = usernameself.password = passwordself.port = portself.ftp = Nonedef connect(self):''''建立ftp远程连接'''try:self.ftp = FTP()self.ftp.connect(host=self.ip, port=self.port)self.ftp.login(user=self.username, passwd=self.password)except Exception as e:print(e)def disconnect(self):''''断开远程连接'''if self.ftp:self.ftp.quit()def upload_file(self, localPath, remotePath, mode='binary'):'''上传文件'''try:with open(localPath, 'rb') as f:if mode == 'binary': # 上传二进制文件self.ftp.storbinary(f'STOR {remotePath}', f)elif mode == 'text': # 上传文本文件self.ftp.storlines(f'STOR {remotePath}', f)print(f'文件已上传,本地文件路径:{localPath},远端文件路径:{remotePath}')except Exception as e:print(f'文件上传失败:{e}')def download_file(self, localPath, remotePath, mode='binary'):'''下载文件'''try:with open(localPath, 'wb') as f:if mode == 'binary': # 下载二进制文件self.ftp.retrbinary(f'RETR {remotePath}', f.write)elif mode == 'text': # 下载文本文件self.ftp.retrlines(f'RETR {remotePath}', f.write)print(f'文件已下载,本地文件路径:{localPath},远端文件路径:{remotePath}')except Exception as e:print(f'文件下载失败:{e}')def upload_files(self, localDirPath, remoteDirPath, mode='binary'):'''指定目录,上传本地目录下的所有文件到远端目录(不递归)'''files = os.listdir(localDirPath)for file in files:localPath = os.path.join(localDirPath, file)remotePath = f'{remoteDirPath}/{file}'self.upload_file(localPath, remotePath, mode)def download_files(self, localDirPath, remoteDirPath, mode='binary'):'''指定目录,下载远端目录下的所有文件到本地目录(不递归)'''self.ftp.cwd(remoteDirPath) # 切换到指定目录files = self.ftp.nlst() # 列出目录下的文件列表for file in files:localPath = os.path.join(localDirPath, file)remotePath = f'{remoteDirPath}/{file}'self.download_file(localPath, remotePath, mode)def rename_remote_file(self, remoteDirPath, oldFileName, newFileName):'''重命名远端文件'''try:self.ftp.cwd(remoteDirPath) # 切换到指定目录self.ftp.rename(oldFileName, newFileName)print(f'{remoteDirPath}目录下,文件重命名:{oldFileName} -> {newFileName}')except Exception as e:print(f'重命名文件失败:{e}')def delete_remote_file(self, remotePath):'''删除远端文件'''try:self.ftp.delete(remotePath)print(f'文件已删除:{remotePath}')except Exception as e:print(f'重命名文件失败:{e}')def delete_remote_files(self, remoteDirPath):'''删除远端目录下的所有文件(不递归)'''self.ftp.cwd(remoteDirPath) # 切换到指定目录files = self.ftp.nlst()  # 列出目录下的文件列表for file in files:remotePath = f'{remoteDirPath}/{file}'self.delete_remote_file(remotePath)if __name__ == '__main__':# 主机信息ip = '192.168.215.1'username = 'admin'password = '123456'# 创建对象ftp = FtpUtil(ip, username, password)ftp.connect()# 上传文件localPath = r'D:\测试文件\a.txt'remotePath = r'/usr/a.txt'ftp.upload_file(localPath, remotePath)# 下载文件localPath = r'D:\测试文件\b.txt'remotePath = r'/usr/b.txt'ftp.download_file(localPath, remotePath)ftp.disconnect()

2. sftp工具类

首先安装paramiko第三方库:

pip install paramiko

出现如下图,表示安装成功:

在这里插入图片描述

编写sftp工具类,我这里取名为 sftp_util.py

import os
import stat
import paramikoclass SftpUtil:def __init__(self, ip, username, password, port=22):self.ip = ipself.username = usernameself.password = passwordself.port = portself.transport = Noneself.sftp = Nonedef connect(self):''''建立sftp远程连接'''try:self.transport = paramiko.Transport(sock=(self.ip, self.port))self.transport.connect(username=self.username, password=self.password)self.sftp = paramiko.SFTPClient.from_transport(self.transport)except Exception as e:print(e)def disconnect(self):''''断开远程连接'''if self.sftp:self.sftp.close()if self.transport:self.transport.close()def upload_file(self, localPath, remotePath):'''上传文件'''try:self.sftp.put(localPath, remotePath)print(f'文件已上传,本地文件路径:{localPath},远端文件路径:{remotePath}')except Exception as e:print(f'文件上传失败:{e}')def download_file(self, localPath, remotePath):'''下载文件'''try:self.sftp.get(remotePath, localPath)print(f'文件已下载,本地文件路径:{localPath},远端文件路径:{remotePath}')except Exception as e:print(f'文件下载失败:{e}')def upload_files(self, localDirPath, remoteDirPath):'''指定目录,上传本地目录下的所有文件到远端目录(不递归)'''files = os.listdir(localDirPath)for file in files:localPath = os.path.join(localDirPath, file)remotePath = f'{remoteDirPath}/{file}'self.upload_file(localPath, remotePath)def download_files(self, localDirPath, remoteDirPath):'''指定目录,下载远端目录下的所有文件到本地目录(不递归)'''files = self.sftp.listdir(remoteDirPath)for file in files:localPath = os.path.join(localDirPath, file)remotePath = f'{remoteDirPath}/{file}'self.download_file(localPath, remotePath)def get_remote_files(self, remoteDirPath):'''获取远端目录下所有文件路径(递归),返回文件路径列表'''filePathList = []items = self.sftp.listdir_attr(remoteDirPath)for item in items:remotePath = f'{remoteDirPath}/{item.filename}'# 如果是目录,则递归调用if stat.S_ISDIR(item.st_mode):subDirList = self.get_remote_files(remotePath)filePathList.extend(subDirList)# 如果是文件,则直接添加到结果列表中elif stat.S_ISREG(item.st_mode):filePathList.append(remotePath)return filePathListdef recursive_download_files(self, localDirPath, remoteDirPath, baseDirPath=''):'''递归下载远端目录下的所有文件到本地目录(把整个远端目录下载到本地目录下)'''remotePathList = self.get_remote_files(remoteDirPath)for remotePath in remotePathList:if baseDirPath:stitchedPath = remotePath.split(f'{baseDirPath}/')[-1].replace('/', '\\')else:stitchedPath = remotePath.replace('/', '\\')localPath = os.path.join(localDirPath, stitchedPath)localDirPath = os.path.dirname(localPath)# 如果本地目录不存在,则创建if not os.path.exists(localDirPath):os.makedirs(localDirPath)self.sftp.get(remotePath, localPath)print(f'文件已下载,本地文件目录路径:{localDirPath},远端文件目录路径:{remoteDirPath}')if __name__ == '__main__':# 主机信息ip = '192.168.215.1'username = 'admin'password = '123456'# 创建对象sftp = SftpUtil(ip, username, password)sftp.connect()# 上传文件localPath = r'D:\测试文件\a.txt'remotePath = r'/usr/a.txt'sftp.upload_file(localPath, remotePath)# 下载文件localPath = r'D:\测试文件\b.txt'remotePath = r'/usr/b.txt'sftp.download_file(localPath, remotePath)sftp.disconnect()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/65534.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Airbnb/Booking 系统设计(high level architecture)

原文地址 CodeKarle: Airbnb System Design | Booking.com System Design B站搜 “Airbnb System Design” 有视频版本 需求: 功能性需求 系统用户包括商家和客人。 Hotel - 商家(拥有hotel的人) onboarding - 商家可以入住系统。 update…

【QT开发自制小工具】PDF/图片转excel---调用百度OCR API接口

前言 前几年WPS还可以免费处理5页以内的PDF转excel,现在必须付费了,而且其他在线的PDF转excel都是要收费的,刚好前几年调研过百度OCR的高精度含位置接口,依然是每天可以免费调用50次,本篇是基于此接口,开发…

Vscode左大括号不另起一行、注释自动换行

参考大佬的博客VSCode 格式化 cpp 文件时配置左大括号不换行_vscode大括号不换行-CSDN博客 Clang_format_style {BasedOnStyle: Chromium, IndentWidth: 4}

原神新角色玛薇卡配队攻略 原神玛薇卡技能机制

原神在2025年1月1日即将迎来一次版本更新,玛薇卡、茜特菈莉、蓝砚三名角色即将上线,今天就给大家抢先介绍一下玛薇卡的机制和配队。 技能机制 战技挂火:战技不用充能就可以输出,但是挂火频率和范围比香菱低一些,适合搭…

8086汇编(16位汇编)学习笔记10.寄存器总结

8086汇编(16位汇编)学习笔记10.寄存器总结-C/C基础-断点社区-专业的老牌游戏安全技术交流社区 - BpSend.net 寄存器 8086CPU有14个寄存器 它们的名称为: AX、BX、CX、DX、SI、DI、SP、BP、 IP**、CS、DS、ES、**SS、PSW。 8086CPU所有的寄存器都是16位的&#…

llamafactory报错:双卡4090GPU,训练qwen2.5:7B、14B时报错GPU显存不足(out of memory),轻松搞定~~~

实际问题场景: 使用llamafactory进行微调qwen2.5 7B和14B的大模型时,会出现out of memory的报错。尝试使用降低batch_size(原本是2,现在降到1)的方式,可以让qwen2.5:7B跑起来,但时不时会不稳定…

Java设计模式 —— 【结构型模式】享元模式(Flyweight Pattern) 详解

文章目录 概述结构案例实现优缺点及使用场景 概述 享元模式也叫蝇量模式:运用共享技术有效地支持大量细粒度的对象; 常用于系统底层开发,解决系统的性能问题。像数据库连接池,里面都是创建好的连接对象,在这些连接对象…

【maven】什么是坐标(依赖)继承与模块、web项目启动访问

目录 2. Maven 基础 2.1 坐标 2.1.0 什么是坐标(依赖) 2.1.1 获得坐标 2.1.2 使用坐标 2.1.3 依赖范围 2.1.4 依赖传递 2.1.5 依赖冲突&调节原则 2.1.6 依赖排除 2.1.7 使用第三方jar包 2.2 继承与模块 2.2.1 概述 2.2.2 分析 2.2.3 实…

操作系统论文导读(八):Schedulability analysis of sporadic tasks with multiple criticality specifications——具有多个

Schedulability analysis of sporadic tasks with multiple criticality specifications——具有多个关键性规范的零星任务的可调度性分析 目录 一、论文核心思想 二、基本定义 2.1 关键性指标 2.2 任务及相关参数定义 2.3 几个基础定义 三、可调度性分析 3.1 调度算法分…

【LeetCode】2506、统计相似字符串对的数目

【LeetCode】2506、统计相似字符串对的数目 文章目录 一、哈希表位运算1.1 哈希表位运算 二、多语言解法 一、哈希表位运算 1.1 哈希表位运算 每个字符串, 可用一个 int 表示. (每个字符 是 int 的一个位) 哈希表记录各 字符组合 出现的次数 步骤: 遇到一个字符串, 得到 ma…

uniapp使用ucharts组件

1.ucharts准备 有两种使用方式:一种是在uni的插件市场下载(组件化开发)。一种是手动引入ucharts包。官方都封装好组件了,我们不用岂不是浪费。 直接去dcloud插件市场(DCloud 插件市场)找,第一…

YOLOv11模型改进-模块-引入多尺度大核注意力Multi-scale Large Kernel Attention

MLKA 的提出源于图像超分辨率任务的挑战性,该任务需重建低质量图像缺失的高频信息,但因 LR 与 HR 图像对应关系复杂,寻找像素相关性困难。此前模型扩展容量的方法增加了训练负担和数据收集成本,而采用的注意力机制无法同时获取局部…

《战神:诸神黄昏》游戏运行时提示找不到emp.dll怎么办?emp.dll丢失如何修复?

《战神:诸神黄昏》游戏运行时提示找不到emp.dll怎么办?emp.dll丢失的修复方法 在畅游《战神:诸神黄昏》这款史诗级游戏的过程中,如果突然遭遇“找不到emp.dll”的错误提示,无疑会打断你的冒险之旅。作为一名深耕软件开…

RabbitMQ基础篇之快速入门

文章目录 一、目标需求二、RabbitMQ 控制台操作步骤1.创建队列2.交换机概述3.向交换机发送消息4.结果分析5.消息丢失原因 三、绑定交换机与队列四、测试消息发送五、消息查看六、结论 一、目标需求 新建队列:创建 hello.queue1 和 hello.queue2 两个队列。消息发送…

非数学专业小白第一次学习Mathematica心得和体会

文章目录 1.软件界面说明2.我为什么要学习Mathematica软件3.如何进行学习4.一些具体使用4.1正余弦函数4.2一个图里面两个函数4.3 3D图形的绘制4.4密度图4.5三维向量图4.6坐标轴说明4.7图像说明4.8绘图的图例4.9指定范围4.10指定绘图样式4.11极限方程求和4.12基本图4.13邻接矩阵…

C#实现图像骨架化(ZhangSuen细化算法)

原始图像: 骨架化后图像: 需要安装一个NuGet包:System.Drawing.Common 代码如下: using System.Drawing; using System.Drawing.Imaging;public class Image {public int Width { get; }public int Height { get; }private bool[,] pixels;// 构造函数,初始化图像的宽度…

【论文阅读笔记】IC-Light

SCALING IN-THE-WILD TRAINING FOR DIFFUSION-BASED ILLUMINATION HARMONIZATION AND EDITING BY IMPOSING CONSISTENT LIGHT TRANSPORT 通过施加一致的光线传输来扩展基于扩散模型的真实场景光照协调与编辑训练 前言摘要引言相关工作基于学习的基于扩散模型的外观和光照操纵光…

论文阅读 - 《Large Language Models Are Zero-Shot Time Series Forecasters》

Abstract 通过将时间序列编码为数字组成的字符串,我们可以将时间序列预测当做文本中下一个 token预测的框架。通过开发这种方法,我们发现像GPT-3和LLaMA-2这样的大语言模型在下游任务上可以有零样本时间序列外推能力上持平或者超过专门设计的时间序列训…

《机器学习》——线性回归模型

文章目录 线性回归模型简介一元线性回归模型多元线性回归模型误差项分析一元线性模型实例完整代码 多元线性模型实例完整代码 线性回归模型简介 线性回归是利用数理统计中回归分析,来确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法。 相关关系&…

redis cluster集群

华子目录 什么是redis集群redis cluster的体系架构什么是数据sharding?什么是hash tag集群中删除或新增节点,数据如何迁移?redis集群如何使用gossip通信?定义meet信息ping消息pong消息fail消息(不是用gossip协议实现的&#xff0…