使用Kaggle API下载数据集时遇MemoryError/UnicodeDecodeError的解决办法
Kaggle API下载headwater/Camels数据集崩溃问题
问题场景
尝试用Kaggle API在本地下载headwater/Camels数据集,运行代码时程序崩溃,代码如下:
api = kaggle.KaggleApi(json_str) api.authenticate() api.datasets_download(owner_slug='headwater', dataset_slug='Camels')
报错信息
Windows系统
test_dload_archive.py:8: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ..\venv\lib\site-packages\kaggle\api\kaggle_api.py:1494: in datasets_download (data) = self.datasets_download_with_http_info(owner_slug, dataset_slug, **kwargs) # noqa: E501 ..\venv\lib\site-packages\kaggle\api\kaggle_api.py:1563: in datasets_download_with_http_info return self.api_client.call_api( ..\venv\lib\site-packages\kaggle\api_client.py:329: in call_api return self.__call_api(resource_path, method, ..\venv\lib\site-packages\kaggle\api_client.py:161: in __call_api response_data = self.request( ..\venv\lib\site-packages\kaggle\api_client.py:351: in request return self.rest_client.GET(url, ..\venv\lib\site-packages\kaggle\rest.py:247: in GET return self.request("GET", url, _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <kaggle.rest.RESTClientObject object at 0x000001B1FAE01D80> method = 'GET' url = 'https://www.kaggle.com/api/v1/datasets/download/headwater/Camels' query_params = [] headers = {'Accept': 'file', 'User-Agent': 'Swagger-Codegen/1/python'} body = None, post_params = {}, _preload_content = True, _request_timeout = None …… if six.PY3: > r.data = r.data.decode('utf8') E MemoryError ..\venv\lib\site-packages\kaggle\rest.py:235: MemoryError
Linux系统
if six.PY3: > r.data = r.data.decode('utf8') E UnicodeDecodeError: 'utf-8' codec can't decode byte 0xcb in position 14: invalid continuation byte
推测原因
问题源于大文件下载时,Kaggle API默认将整个文件加载到内存中尝试以UTF-8解码,导致内存不足或二进制文件解码错误。
解决方法
方法1:指定路径直接保存文件(推荐)
修改代码,通过path和filename参数让API直接将下载的压缩包写入本地文件,避免加载到内存:
api = kaggle.KaggleApi(json_str) api.authenticate() # 将文件保存到当前目录下的camels.zip api.datasets_download(owner_slug='headwater', dataset_slug='Camels', path='.', filename='camels.zip')
该方式采用流式写入,内存占用极低,同时跳过了不必要的UTF-8解码步骤。
方法2:使用Kaggle命令行工具下载
如果Python API仍有问题,直接用Kaggle命令行工具下载,同样是流式处理:
kaggle datasets download -d headwater/Camels
下载完成后手动解压即可。
方法3:临时修改Kaggle库文件(不推荐)
若必须使用Python API且无法修改代码逻辑,可临时修改kaggle/rest.py中报错的解码逻辑:
找到对应行(约235行),注释掉UTF-8解码代码:
# if six.PY3: # r.data = r.data.decode('utf8')
注意:此方法会修改第三方库文件,更新Kaggle API后会失效,仅作临时应急用。
内容的提问来源于stack exchange,提问作者forestbat
相关产品推荐
相关产品推荐

