如何避免Python 2生成.npz/.npy文件时的额外头解析警告?
解决Python 2生成npz/npy文件的头解析警告问题
问题背景
在Python 2环境中手动打包生成包含.npy文件的.npz文件,使用Python 3读取时会触发以下警告:
UserWarning: Reading
.npyor.npzfile required additional header parsing as it was created on Python 2. Save the file again to speed up loading and avoid this warning.
需求是在Python 2中直接生成无需额外头解析的兼容文件,规避该警告。
原因分析
Python 2与Python 3的字符串编码模型存在差异(bytes/unicode区分),手动调用np.lib.npyio.format.write_array生成的.npy文件头会保留Python 2的格式特征,导致Python 3读取时需要额外解析。而numpy内置的文件保存函数会自动处理跨版本兼容问题。
解决方案
方案1:改用numpy内置的savez_compressed(推荐)
无需手动操作zip包,直接用numpy提供的函数生成兼容的压缩npz文件:
import numpy as np array = [1,2,3] # 直接生成兼容Python 3的压缩npz文件 np.savez_compressed("myFile.npz", myFile=np.array(array))
方案2:保留手动打包逻辑,改用np.save生成.npy内容
如果必须手动处理zip包,将原代码中的write_array替换为np.save,并确保启用fix_imports=True(Python 2中默认生效):
import zipfile import io import numpy as np array = [1,2,3] with zipfile.ZipFile("myFile.npz", 'w', compression=zipfile.ZIP_DEFLATED, allowZip64=True) as zipf: buf = io.BytesIO() # 用np.save自动处理跨版本兼容的头信息 np.save(buf, np.array(array), fix_imports=True) buf.seek(0) # 重置文件指针到开头 zipf.writestr("myFile.npy", buf.getvalue())
原理说明
np.save和np.savez系列函数通过fix_imports参数,在Python 2环境中生成文件时会自动调整数据头的格式,将Python 2特有的类型标识转换为Python 3可直接识别的格式,从而避免读取时的额外解析操作。
内容的提问来源于stack exchange,提问作者Avatar36
相关产品推荐
相关产品推荐

