调用National Grid数据门户API导入CSV到pandas报JSONDecodeError问题
问题原因分析
- 第一个低级错误:导入的是
requests库,调用时写的request.get(url)拼写缺失末尾的s,会先触发NameError,即便修正拼写也会遇到后续JSON解析错误。 - 核心逻辑错误:你请求的目标资源是CSV格式文件,返回内容为逗号分隔的纯文本,并非JSON结构,使用
json.loads()解析CSV内容本身就是逻辑错配,这是触发JSONDecodeError: Expecting value: line 1 column 1 (char 0)的根本原因,和BOM处理无关。
正确实现方案
pandas的read_csv原生支持直接传入URL读取数据,同时内置编码处理能力,不需要手动下载文件到本地,也不需要额外做编码转码、JSON解析操作,可直接按如下写法实现需求:
import pandas as pd url = 'https://data.nationalgrideso.com/backend/dataset/7e142b03-8650-4f46-8420-7ce1e84e1e5b/resource/a61c6c26-62ec-41e1-ae25-ed95f4562274/download/reactive-utilisation-data-apr-2020-mar-2022.csv' # 指定encoding为utf-8-sig即可直接处理BOM标记 df = pd.read_csv(url, encoding='utf-8-sig')
如果需要先通过requests发起请求再解析,可通过io.StringIO包装响应文本后传入read_csv,写法如下:
import requests import pandas as pd from io import StringIO url = 'https://data.nationalgrideso.com/backend/dataset/7e142b03-8650-4f46-8420-7ce1e84e1e5b/resource/a61c6c26-62ec-41e1-ae25-ed95f4562274/download/reactive-utilisation-data-apr-2020-mar-2022.csv' resp = requests.get(url) # 校验请求成功后再解析 if resp.status_code == 200: df = pd.read_csv(StringIO(resp.text), encoding='utf-8-sig')
内容的提问来源于stack exchange,提问作者splitznook
相关产品推荐
相关产品推荐

