构建Nasdaq ITCH订单簿时解压.gz文件触发EOFError报错如何解决
问题原因分析
- 报错
EOFError: Compressed file ended before the end-of-stream marker was reached的本质是你使用的03272019.NASDAQ_ITCH50.gz压缩文件不完整,文件尾部的gzip校验标识缺失,不属于代码逻辑错误。 - 触发该问题的常见场景:纳斯达克FTP站点对匿名访客的下载存在限速、连接超时限制,下载过程中网络波动导致传输中断,最终得到的文件是未传输完成的残缺文件,所以系统自带解压工具、gzip命令都无法正常读取。
- 额外排查点:如果教程中定义的
SOURCE_FILE参数值和你手动下载的文件名不一致,may_be_download函数会检测到目标路径无对应文件,自动触发不支持断点续传的下载任务,新下载的残缺文件会直接覆盖你手动放入的文件,导致问题重复出现。
可行解决步骤
- 先校验现有文件完整性:正常2019年3月27日的ITCH50压缩包大小在1.2GB-1.5GB区间,右键查看文件属性如果远小于该数值,直接删除残缺文件。
- 优先修改代码避免自动覆盖,注释原自动下载逻辑,直接指定你要读取的本地文件路径,修改后的参考代码如下:
# 注释掉原有自动下载代码,避免重复下载残缺文件 # file_name = may_be_download(urljoin(FTP_URL, SOURCE_FILE)) # 直接指定手动下载的文件路径,根据你实际存放路径调整即可 file_name = Path("./data/03272019.NASDAQ_ITCH50.gz") date = file_name.name.split('.')[0]
- 使用支持断点续传的工具下载完整文件:
- 打开终端执行wget命令下载:
wget -c ftp://anonymous@ftp.nasdaqtrader.com/ITCH/03272019.NASDAQ_ITCH50.gz -P ./data/,-c参数支持断点续传,网络中断后重新执行同一条命令即可继续下载,无需从头传输。 - 下载完成后执行完整性校验命令:
gzip -t ./data/03272019.NASDAQ_ITCH50.gz,如果命令执行后无任何输出,说明文件完整无损坏,可正常运行后续代码。
- 打开终端执行wget命令下载:
- 若该日期文件始终下载失败,可以更换纳斯达克公开的其他日期的ITCH50测试文件,仅需修改代码中
SOURCE_FILE变量为对应日期的文件名即可,无需固定使用2019年3月27日的文件完成教程练习。
内容的提问来源于stack exchange,提问作者sir.isaac.newton
相关产品推荐
相关产品推荐

