gpt4 book ai didi

python - 通过 SFTP 检索文件时为 "IOError: size mismatch in get!"

转载 作者:行者123 更新时间:2023-12-02 20:09:28 25 4
gpt4 key购买 nike

我有一个脚本,用于定期通过 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] +
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

我查看了 Paramiko 文档,但没有看到有关触发此错误的原因的解释。此外,该代码通常会在后续尝试中成功运行,或者会成功运行该日期范围内的前几个文件,然后在下载我需要检索的所有文件的过程中出错。 SO 上的其他答案说它可能与驱动器上的可用空间有关,但我尝试清除目标文件夹但没有帮助。如果有任何区别,我正在尝试下载到网络驱动器/云存储。

这是我用来检索文件的函数和代码(通过 Paramiko):

def get_all_files(start_date, end_date, sftp_dir, filename, local_dir,  \
sftp_connection):

sftp.get(sftp_dir + filename, local_dir + filename)

with pysftp.Connection('******.com', username='*****', password='******', cnopts=cnopts) as sftp:
get_all_files(startdate, enddate, "vma" + foldernumber + "/logs/", txtype[1] + single_date2 + ".log", txtype[2] + foldernumber + "\\", sftp)

我希望在不产生此错误的情况下检索所有可下载文件。

最佳答案

错误信息 IOError: size mismatch in get! 950272 != 1018742Paramiko-library 的 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-function 确实正确地处理了文件,但它不会等待本地文件系统适应,因此可能会获得状态(包括大小) getfo 函数使用 s = os.stat(localpath) 完成文件处理后的本地文件。

这可能导致本地文件大小和正确预取的远程文件大小不一致,因此可能抛出 IOError "size mismatch in get!{} != {}".format(s.st_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) 将其替换为在文件处理期间使用文件对象获取大小的正常工作的检查本地文件。

关于python - 通过 SFTP 检索文件时为 "IOError: size mismatch in get!",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53945594/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com