从服务器下载文件时处理 EOFError
Deal with EOFError while downloading files from server
用例:
使用 ftplib 下载数十万个 xmls 文件(大小从字节到 50 mb/file),结构如下 /year-month/year-month-day/hours/files。
所以我循环遍历给定日期的每个小时文件夹,对于每个小时文件夹,我用 ftp.nlst() 存储所有文件名,然后循环遍历每个文件名,然后像这样下载相关文件。
with open(local_file, 'wb') as fhandle:
try:
ftp.retrbinary('RETR ' + filename, fhandle.write)
except EOFError:
try:
fhandle.close()
os.remove(local_file)
ftp = ftplib.FTP()
ftp.connect(self.remote_host,self.port, timeout=60)
ftp.login(self.username, self.passwd, acct="")
ftp.cwd(self.input_folder + '/' + subdir)
try:
with open(local_file, 'wb') as fhandle:
ftp.retrbinary('RETR ' + filename, fhandle.write, 8192)
except:
self.log.error('i give up !!!')
预期:
对于作为输入文件夹给出的每一天,下载所有相关的 xml 文件
我得到的:
EOFError
我已经尝试过的:
- 我浏览了关于该主题的所有可能的帖子
Whosebug 和一般的网络。
- 我试过关闭和打开
hour 文件夹中每个子文件夹的 ne 连接。
- 似乎不是某一特定文件导致了问题。这绝对不是第一个。我在使用
ftp.retrbinary()
下载文件时得到这个 EOFError
。这与我下载了数十万个 xmls 文件这一事实有关,因为我已经用 2000 个文件测试了脚本并且没有任何异常,但是对于大约 287000 个文件我总是得到它。我不明白的是,脚本每次下载相同的 amount/number 个 xml 文件,大约 159 000,而且总是
我试过
中的缓冲区大小
ftp.retrbinary('RETR ' + filename, fhandle.write,4096)
问题:
可能是我漏掉了什么?
如何处理此 EOFError 以继续下载我的所有文件...并且不会失去理智。
我终于找到了解决问题的方法。我现在不是为每个子文件夹打开一个连接,而是为每个要下载的文件打开一个连接。它的性能较差,但我通过了这个 EOFError
。
我还发现我要从中下载文件的 FTP 服务器有限制,例如并行连接的数量或连接可以持续多长时间。
用例:
使用 ftplib 下载数十万个 xmls 文件(大小从字节到 50 mb/file),结构如下 /year-month/year-month-day/hours/files。 所以我循环遍历给定日期的每个小时文件夹,对于每个小时文件夹,我用 ftp.nlst() 存储所有文件名,然后循环遍历每个文件名,然后像这样下载相关文件。
with open(local_file, 'wb') as fhandle:
try:
ftp.retrbinary('RETR ' + filename, fhandle.write)
except EOFError:
try:
fhandle.close()
os.remove(local_file)
ftp = ftplib.FTP()
ftp.connect(self.remote_host,self.port, timeout=60)
ftp.login(self.username, self.passwd, acct="")
ftp.cwd(self.input_folder + '/' + subdir)
try:
with open(local_file, 'wb') as fhandle:
ftp.retrbinary('RETR ' + filename, fhandle.write, 8192)
except:
self.log.error('i give up !!!')
预期:
对于作为输入文件夹给出的每一天,下载所有相关的 xml 文件
我得到的:
EOFError
我已经尝试过的:
- 我浏览了关于该主题的所有可能的帖子 Whosebug 和一般的网络。
- 我试过关闭和打开 hour 文件夹中每个子文件夹的 ne 连接。
- 似乎不是某一特定文件导致了问题。这绝对不是第一个。我在使用
ftp.retrbinary()
下载文件时得到这个EOFError
。这与我下载了数十万个 xmls 文件这一事实有关,因为我已经用 2000 个文件测试了脚本并且没有任何异常,但是对于大约 287000 个文件我总是得到它。我不明白的是,脚本每次下载相同的 amount/number 个 xml 文件,大约 159 000,而且总是 我试过
中的缓冲区大小ftp.retrbinary('RETR ' + filename, fhandle.write,4096)
问题:
可能是我漏掉了什么? 如何处理此 EOFError 以继续下载我的所有文件...并且不会失去理智。
我终于找到了解决问题的方法。我现在不是为每个子文件夹打开一个连接,而是为每个要下载的文件打开一个连接。它的性能较差,但我通过了这个 EOFError
。
我还发现我要从中下载文件的 FTP 服务器有限制,例如并行连接的数量或连接可以持续多长时间。