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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,064评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,606评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,011评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,550评论 1 269
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,465评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,919评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,428评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,075评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,208评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,185评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,191评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,914评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,482评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,585评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,825评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,194评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,703评论 2 339

推荐阅读更多精彩内容