python ftplib模块探坑之旅二 文件传输: 上传下载

image.png

我们使用 ftp 本身最重要的就是文件的传输 :上传下载

其他的都是 边缘毛毛雨,既然在上一步 我们已经做到 了登录 和遍历文件,创建文件目录,删除文件,切换目录,这次我们要做的就是 最重要的一项 就是上传和下载。
说实话 看了github上的 关于python ftp 的仓库代码 ,大部分都是 demo级别,登录完了就没有下文,偶然看到有下载上传的 ,还是不具备可参考性。自己写了些,频繁试错,坑 真是不少。

具体代码 我已经 项目化 ,可以集成给伸手党
https://github.com/mullerhai/pyFtps

先说下载
下载是使用
ftps.retrbinary('RETR fileRealname',file_handler,buffersize) 方法

首先 ftp上真实存在的文件,你要知道相对ftp服务器 文件根目录的 文件绝对路径,并可以读写它,
读写完毕要 关闭它。这里推荐使用 with 语法,不需要显式关闭它
先我们登录上

from ftplib import FTP
from ftplib import FTP_TLS

host='ftps.baidu.com'
port='21'
user='zh***ng'
pwd='zz***mt.2'
ip='117.43,135.150'
files = []

_old_makepasv = FTP_TLS.makepasv

def _new_makepasv(self):
    host,port = _old_makepasv(self)
    host = self.sock.getpeername()[0]
    return host,port

FTP_TLS.makepasv = _new_makepasv

#实名用户 加密登录
ftps = FTP_TLS(host)
ftps.set_debuglevel(2)
ftps.auth()

ftps.login(user,pwd)
ftps.makepasv()
ftps.sendcmd('pbsz 0')
ftps.set_pasv(True)
ftps.prot_p()

下载服务器文件 代码

sever_filename='AA70p1_GDscore_20180330.txt'
local_filename='my_mac/local/path/filename.txt'
bufsize=1024 #缓冲区大小
with open(severFilename,"wb") as  f:
      ftps.retrbinary('RETR %s' % local_filename, f.write, bufsize)
ftps.quit #退出ftp

需要 注意的 是 retrbinary ()方法中的 'RETR' 是关键字 ,必须要有,另外 'RETR' 之后 不要带'/',
sever_filename是服务器的真实文件目录
local_filename 是你要下载到操作真实机器的本地路径,如果中间没有代理机器
local_filename 和sever_filename 可以一致, local_filename 可以只有文件名,则下载到项目里的目录中
open() 使用 ’wb' 模式, 在 ftps.retrbinary( ) 中 要使用 f.write 写。

上传 本地文件到服务器 的代码:

local_uploadfile='/Users/geo/Documents/pycode/xgb/geo/AA02p7_new.txt'
sever_will_savefile='AA02p7_newi.txt'

ftps.cwd("/haining/TH") #切换到要上传文件的服务器路径
with open(local_uploadfile,'rb') as  f_up:
  ftps.storbinary('STOR '+  sever_will_savefile, f_up ,bufsize)

ftps.set_debuglevel(0) #关闭调试模式
ftps.quit #退出ftp

local_uploadfile='/Users/geo/Documents/pycode/xgb/geo/AA02p7_new.txt'
sever_will_savefile='/haining/TH/AA02p7_newi.txt'


with open(local_uploadfile,'rb') as  f_up:
  ftps.storbinary('STOR '+  sever_will_savefile , f_up ,bufsize)

ftps.set_debuglevel(0) #关闭调试模式
ftps.quit #退出ftp

local_uploadfile='/Users/geo/Documents/pycode/xgb/geo/AA02p7_new.txt'
sever_will_savefile='AA02p7_newi.txt'

with open(local_uploadfile,'rb') as  f_up:
  ftps.storbinary('STOR  haining/TH/'+  sever_will_savefile, f_up ,bufsize)

ftps.set_debuglevel(0) #关闭调试模式
ftps.quit #退出ftp

以上三种都可以正常使用,另外你也可以重命名多次 一起保存

local_uploadfile='/Users/geo/Documents/pycode/xgb/geo/AA02p7_new.txt'
sever_will_savefile1='AA02p7_newi.txt'
sever_will_savefile2='AA02p7_newx.txt'

with open(local_uploadfile,'rb') as  f_up:
  ftps.storbinary('STOR  haining/TH/'+  sever_will_savefile1 , f_up ,bufsize)

with open(local_uploadfile,'rb') as  f_up:
  ftps.storbinary('STOR  haining/TH/'+  sever_will_savefile2 , f_up ,bufsize)

ftps.set_debuglevel(0) #关闭调试模式
ftps.quit #退出ftp

但是 ftps.storbinary('STOR ' ) 之后 不要单独只有 '/',否则会失败

## 这种会失败
local_uploadfile='/Users/geo/Documents/pycode/xgb/geo/AA02p7_new.txt'
sever_will_savefile='AA02p7_newi.txt'

with open(local_uploadfile,'rb') as  f_up:
  ftps.storbinary('STOR '+'/'+ sever_will_savefile,f_up,bufsize)

另外要注意的就是 sever_will_savefile 不要带 你自己操作电脑本地的文件路径,否则也会失败

ftps.storbinary('STOR ') 'STOR'也是 关键字 要带上,读写文件 使用 'rb'模式
需要注意的是 会有延迟 ,有时候其实是上传成功了,但是在目录中没有看到,稍等一下

文件在 项目内外 都没有关系

ftp 文件夹 单层多层也没有关系

文件上传成功后可以保证文件不会损坏丢失

目录权限是 drwxr-xr-x 就可以上传

文件 上传后需要重新命名 ,重命名的文件不可以带本地目录符号,仅仅是文件名,可以带ftp 上的文件目录路径,也可以,所以要上传到哪个目录,先切换到哪个目录

上传的目录 写明全路径,最后要以 '/'结尾,否则上传还是会失败,全路径首位 '/',可有可无,

如果是ftps.cwd('path')切换到某一路径,在
ftps.storbinary()'STOR' 后一定不要 带上 '/', 否则 会失败

file_handler ,open(), 一定要使用with open(), 否则还是容易失败。

ftps.cwd(path) ,首尾带不带'/'都可以

我们经常会碰到的错误是 在上传的时候不能创建文件,其实两种可能,一是权限不足,二是文件路径写的有问题
https://stackoverflow.com/questions/47130246/ftplib-error-perm-553-could-not-create-file-python-2-4-4?rq=1&utm_medium=organic&utm_source=google_rich_qa&utm_campaign=google_rich_qa

https://stackoverflow.com/questions/31613111/python-ftplib-error-553?utm_medium=organic&utm_source=google_rich_qa&utm_campaign=google_rich_qa

https://stackoverflow.com/questions/35294662/python-ftp-method-error-553-could-not-create-file

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • FTP服务概述 简单FTP构建及访问 VSFTP服务基础 用户禁锢、黑白名单 FTP并发及带宽限制 一、FTP服务...
    紫_轩阅读 12,365评论 3 25
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,138评论 19 139
  • ftp 文件传输协议 跨平台 上传下载文件 vsftpd 工具:非常安全的文件传输协议;默认的命令端口21号,数据...
    柒夏锦阅读 9,585评论 1 9
  • .bat脚本基本命令语法 目录 批处理的常见命令(未列举的命令还比较多,请查阅帮助信息) 1、REM 和 :: 2...
    庆庆庆庆庆阅读 12,632评论 1 19
  • #################匿名权限控制############### anonymous_enable=Y...
    牧民阅读 10,059评论 2 4

友情链接更多精彩内容