您的位置:首页 > 编程语言 > PHP开发

使用pysftp模块或者paramiko模块时出现IOError: [Errno 13] Permission denied: 或IOError: [Errno 2]

2017-10-17 11:50 696 查看
最近,要使用python编写程序实现从本地上传文件到FTP服务器,从服务器下载文件到本地这样一个流程。首先,在网上查了需要使用的python模块,

看到使用pysftp和paramiko模块中的put和get方法都能实现。于是,就尝试了一下,可是莫名了出现了许多问题,有IOError: [Errno 13] Permission denied:类型的,

有IOError: [Errno 2] No such file, put() sftp_client类型的,有的出现IOError: [Errno 22] invalid mode ('rb') or filename异常的,还有其他类型的错误。总之,

纠结了三天左右,最终才解决这些问题,而解决的方式可能会让人大呼受不了。下面就在这过程中遇到的问题,解决的方式总结如下:

1.IOError: [Errno 2] No such file, put() sftp_client问题及解决的方式

srv = pysftp.Connection(~)

srv.put(localPath,remotePath)

上面的方式没有上传成功,但是改成下面的方式竟然成功了。

srv = pysftp.Connection(~)

srv.chdir(remotePath)

srv.put(localPath)

具体的代码如下:

原来出现异常的代码:

sftp.put('C:/Users/Administrator/Desktop/test.doc','/root/myTest/testdata/')

修改后,能够将本地路径'C:/Users/Administrator/Desktop/test.doc'下的test.doc文件成功上传到服务器'/root/myTest/testdata/'路径下:

with pysftp.Connection('10.2.19.12', username='root', password='yunjikeji', cnopts=cnopts) as sftp:
sftp.chdir('/root/myTest/data1')
sftp.put('C:/Users/Administrator/Desktop/test.doc')


2.IOError: [Errno 22] invalid mode ('wb') or filename或者IOError: [Errno 13] Permission denied:问题

出现这种问题,查阅资料有的说是路径的格式问题,需要在路径前加r或者将本地路径中的'\'换成'/',因为POSIX-like file system use '/'。

sftp.get('/root/myTest/data1/', 'C:/Users/Administrator/Desktop/python.pdf', callback=None, preserve_mtime=False)#这里将本地文件路径中的'\'换成'/'该问题解决了,但又出现新的问题"IOError: Failure"

最后,折腾了几天重新翻阅API文档,发现里面上传下载的方法如下:

get(remotepath, localpath=None, callback=None, preserve_mtime=False)

注意:这里的remotepath和localpath为:“文件所在目录 + '/' + 文件名”这样形式的完整的文件路径,而不是只有文件的目录,要不然会出上面所列类型的各种错误。

put(localpath, remotepath=None, callback=None, confirm=True, preserve_mtime=False)

注意:这里的remotepath和localpath为:“文件所在目录 + '/' + 文件名” 完整的文件路径,不是只有文件的目录,要不然会出各种错误。

将上面不管是使用pysftp还是paramiko模块中的put还是get方法,将上面的目录改成所要上传下载文件的完整路径(注意:这里的路径包括文件名,要不然程序不知道要将文件存储在哪里,所以会出现各种错误),上面出现的各种问题就不见了。

折腾了这么长时间,竟然是因为把文件路径写成目录了,以至于出现各种异常,也耽误了这么长时间,这是让人受不了。可能是前几天写hdfs文件上传下载的时候,里面的upload和download方法中的目录的路径和这里get和put方法里的文件的完整路径混淆所致吧。总结一下,以后遇到问题,超过几个小时查阅各种方法还是解决不了的情况下,还是直接看官方API文档来的直接而实际,要不然折腾时间还让人心累啊,这也算是一点收获吧。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐