使用datasets.load_dataset加载本地JSON报LZMADecompressor属性错误如何解决
问题根因定位
报错核心为AttributeError: '_lzma.LZMADecompressor' object has no attribute 'needs_input',由两个叠加问题导致:
- 你使用的Python3.7内置lzma模块的
_LZMADecompressor类没有needs_input属性,该属性为Python3.8及以上版本新增特性 - 你自定义的加载脚本
load_datasets.py中对本地未压缩JSON文件调用了dl_manager.download_and_extract方法,该方法会默认尝试识别文件是否为压缩包,触发了lzma解压校验逻辑
排查与解决步骤
- 优先方案:修改自定义数据集加载脚本
你加载的是本地未压缩JSON文件,无需调用解压相关逻辑,直接把load_datasets.py中_split_generators方法里的data_dir = dl_manager.download_and_extract(data_path)替换为直接读取本地路径即可,修改示例:# 原代码 # data_dir = dl_manager.download_and_extract(data_path) # 修改后 data_dir = data_path - 备选方案1:升级Python版本
把Python环境升级到3.8及以上版本,即可直接解决lzma模块缺少属性的问题 - 备选方案2:降级datasets库版本
如果无法升级Python,可将datasets库降级到2.4.0及以下版本,该版本及更早版本不会调用lzma的needs_input属性,执行安装命令:pip install datasets==2.4.0 - 临时规避方案:强制跳过压缩包校验
如果不想修改加载脚本也不想更换环境,可在调用load_dataset前添加如下代码,禁用datasets的自动压缩包检测:from datasets.utils import file_utils original_is_tarfile = file_utils.tarfile.is_tarfile file_utils.tarfile.is_tarfile = lambda x: False
内容的提问来源于stack exchange,提问作者focus
相关产品推荐
相关产品推荐

