最近,要使用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')
出现这种问题,查阅资料有的说是路径的格式问题,需要在路径前加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文档来的直接而实际,要不然折腾时间还让人心累啊,这也算是一点收获吧。