Python通过paramiko的SFTP put上传大批量数据时出现的bug及解决方案


前言

在通过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便是上班提到的确认文件大小的参数。
改了之后,终于解决了自己的问题。


总结

以上,便是本篇的全部内容,如有问题,欢迎评论区交流。

猜你喜欢

转载自blog.csdn.net/qq_55068938/article/details/130969410