文章目录
- 前言
- 一、报错情况
- 二、解决方案
- 1.路径问题
- 2.权限不对
- 3.写法问题
- 4.paramiko版本问题
- 5.sftp.put()参数问题
- 总结
前言
在通过paramiko中的sftp上传大批量数据时,遇到了很奇怪的情况:写好的程序在正常运行3天后,接下来的几天每天上传几百张就回出错(上传之后,服务器上会有另一个程序将文件转移掉),找了很久,目前是暂时恢复正常了。正文如下:
一、报错情况
连接成功后通过put上传数据时,出现错误:IOError: [Errno 2] No such file。但是这个报错不是已开始就出现的,而是上传了几条数据之后,然后才开始报出来,所以并不是表面看到的“文件不存在”那么简单。
二、解决方案
查了挺久,看到的就是如下几点,该说不说,基本都大差不差,但对我的情况来说,并没卵用,真正解决方法的是最后一个方案。大家可以根据自己的情况选择解决方案。
1.路径问题
这个结果是我看到的最多的,就是说确定你本地文件路径和远程路径都是存在的,然后将相对路径改为绝对路径。大家可以通过如下命令验证文件路径是否存在
os.path.exists(filepath) #filepath即为你要验证的文件路径
为True表示路径存在,反之,则路径不存在。但我的情况中,确信路径没问题,所以,该方案于我无用,pass。
2.权限不对
首先,确定下自己代码中写的用户名是否有在远程文件中读写文件的权限。如果没有的话,改下权限去试试,可以参考如下命令进行暴力更改权限:
chmod -R 777 xxx
xxx即为远程文件夹路径,-R可加可不加,加上的话这个远程文件夹下的子文件夹下的权限也会变。
然而,既然我是成功上传了几张之后才报的错,那说明我的权限没问题,所以,方法不适合,pass.
3.写法问题
根据这个博客中说的,将写法改了,即在put之前,先加个chdir,如下:
sftp.chdir(remote_dir)
sftp.put(filepath)
remote_dir为远程文件夹路径,filepath表示的是本地文件路径。
但是改了之后,我的报错依然,所以继续pass.
4.paramiko版本问题
其次,还尝试了更改paramiko的版本,升版、降版都试了,报错依然,pass。
5.sftp.put()参数问题
心烦意乱时,偶然间,翻到了这里,终于找到了答案。原来put时,默认会在事后对state()已确认文件的大小,所以把这个参数给改为False即可,如下:
sftp.put(localpath, remotepath, confirm=False)
localpath即为本地路径,remotepath即为远程文件路径,confirm便是上班提到的确认文件大小的参数。
改了之后,终于解决了自己的问题。
总结
以上,便是本篇的全部内容,如有问题,欢迎评论区交流。