Python &引用;IOError:get中的大小不匹配&引用;通过SFTP检索文件时
我有一个脚本,我使用它定期通过SFTP检索特定文件。有时,脚本会出现以下输出错误:Python &引用;IOError:get中的大小不匹配&引用;通过SFTP检索文件时,python,paramiko,pysftp,Python,Paramiko,Pysftp,我有一个脚本,我使用它定期通过SFTP检索特定文件。有时,脚本会出现以下输出错误: Traceback (most recent call last): File "ETL.py", line 304, in <module> get_all_files(startdate, enddate, "vma" + foldernumber + "/logs/", txtype[1] + single_date2 + ".log", txtype[2] + foldernu
Traceback (most recent call last):
File "ETL.py", line 304, in <module>
get_all_files(startdate, enddate, "vma" +
foldernumber + "/logs/", txtype[1] + single_date2 + ".log", txtype[2] +
foldernumber + "\\", sftp)
File "ETL.py", line 283, in get_all_files
sftp.get(sftp_dir + filename, local_dir + filename)
File "C:\Python27\lib\site-packages\pysftp\__init__.py", line 249, in get
self._sftp.get(remotepath, localpath, callback=callback)
File "C:\Python27\lib\site-packages\paramiko\sftp_client.py", line 806, in get
"size mismatch in get! {} != {}".format(s.st_size, size)
IOError: size mismatch in get! 950272 != 1018742
我希望检索所有可下载的文件时不会产生此错误。错误消息
IOError:get中的大小不匹配!950272 != 如果本地目录上复制的文件的大小与远程文件的预取大小不匹配,则的get函数将引发1018742
:
with open(localpath, "wb") as fl:
size = self.getfo(remotepath, fl, callback)
s = os.stat(localpath)
if s.st_size != size:
raise IOError(
"size mismatch in get! {} != {}".format(s.st_size, size)
)
如果连接和传输过程没有问题,为什么会发生这种情况?
在检查Paramiko代码并试图调试此问题时,我的本地文件系统的一个奇怪行为引起了我的注意。对于从远程文件系统复制的每个文件,本地文件系统都会花一些时间处理注册了正确文件大小的文件
这种行为导致我假设,虽然Paramiko库的get函数正确处理文件,但它不会等待本地文件系统进行调整,因此可能会在getfo函数使用s=os.stat处理完文件后立即获取本地文件的状态(包括大小)(本地路径)
这可能导致本地文件大小与正确预取的远程文件大小不一致,因此可能引发IOError“get!{}!={}中的大小不匹配”。格式(s.st_size,size)
它还将解释为什么不能一致地再现错误,因为Python解释器总是在本地操作系统的同步性方面与不同的环境一起工作
我是如何为自己解决这个问题的?
我操作了get函数的Paramiko代码,该代码可以在“sftp_client.py”的第785行找到,并在文件处理中添加了localsize=fl.tell()
,相应地更新大小检查:
with open(localpath, "wb") as fl:
size = self.getfo(remotepath, fl, callback)
localsize = fl.tell()
if localsize != size:
raise IOError(
"size mismatch {} != {}".format(localsize, size)
)
这应该可以避免有缺陷的本地文件大小检查
s=os.stat(localpath)
将其替换为正常工作的,在文件处理期间使用file对象获取本地文件的大小。如果本地目录上复制的文件的大小与预取的大小不匹配,则get!950272!=1018742中的错误消息IOError:size mismatch in get!950272!
将由的get函数抛出远程文件的名称:
with open(localpath, "wb") as fl:
size = self.getfo(remotepath, fl, callback)
s = os.stat(localpath)
if s.st_size != size:
raise IOError(
"size mismatch in get! {} != {}".format(s.st_size, size)
)
如果连接和传输过程没有问题,为什么会发生这种情况?
在检查Paramiko代码并试图调试此问题时,我的本地文件系统的一个奇怪行为引起了我的注意。对于从远程文件系统复制的每个文件,本地文件系统都花了一些时间处理注册了正确文件大小的文件
这种行为导致我假设,虽然Paramiko库的get函数正确处理文件,但它不会等待本地文件系统进行调整,因此可能会在getfo函数使用s=os.stat处理完文件后立即获取本地文件的状态(包括大小)(本地路径)
这可能导致本地文件大小与正确预取的远程文件大小不一致,因此可能引发IOError“get!{}!={}中的大小不匹配”。格式(s.st_size,size)
它还将解释为什么不能一致地再现错误,因为Python解释器总是在本地操作系统的同步性方面与不同的环境一起工作
我是如何为自己解决这个问题的?
我操作了get函数的Paramiko代码,该代码可以在“sftp_client.py”的第785行找到,并在文件处理中添加了localsize=fl.tell()
,相应地更新大小检查:
with open(localpath, "wb") as fl:
size = self.getfo(remotepath, fl, callback)
localsize = fl.tell()
if localsize != size:
raise IOError(
"size mismatch {} != {}".format(localsize, size)
)
这应该可以避免有缺陷的本地文件大小检查s=os.stat(localpath)
将其替换为在文件处理期间使用file对象获取本地文件大小的正常工作的检查