Tablib fails to convert JSON API response to XLSX file and throws error KeyError:0
Tablib fails to convert JSON API response to XLSX file and throws error KeyError:0
我正在尝试将调用 API 后得到的 JSON 响应转换为 excel 文件。我不需要添加特定的 headers 或只获取特定的数据,我只需要这个调用 returns.
的所有内容
我找到了 tablib
library.
当我从 GitLab 获取数据时,我设法让它工作,但是在将我的有效负载更改为 Tfs 后,我收到一个错误,我不确定问题是什么或如何解决。
这是我的代码:
import requests
import urllib3
import json
from requests.packages.urllib3.exceptions import InsecureRequestWarning
import tablib
import datetime
import time
import os
class gitlab():
def get_closed():
url = "https://IP:443/DefaultCollection/_apis/projects"
payload = {}
querystring = {"api-version":"4.1"}
headers = {
'Content-Type': "application/json-patch+json",
'Authorization': "KEY"
}
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
response = requests.request(
"GET", url, headers=headers, data=payload, params=querystring, verify=False)
return json.loads(response.text)
if __name__ == "__main__":
list_b = gitlab.get_closed()
print(list_b)
data = tablib.Dataset()
data.json = json.dumps(list_b)
data_export = data.export('xlsx')
filename = os.path.dirname(os.path.realpath(__file__)) +'/closed_' + str(datetime.date.today()) + '.xlsx'
with open(filename, 'wb') as f:
f.write(data_export)
f.close()
使用 python script
执行,其中 python 的版本是 3.7.2
显示以下错误:
{'count': 1, 'value': [{'id': 'ID', 'name': 'TFS', 'url': 'https://TFS/DefaultCollection/_apis/projects/PROJ', 'state': 'wellFormed', 'revision': 00, 'visibility': 'private'}]}
Traceback (most recent call last): File ".\gitlab.py", line 94, in <module> data.json = json.dumps(list_with_bugs, indent=4, ensure_ascii=False) File "C:\Users\marialena\AppData\Local\Programs\Python\Python37\lib\site-packages\tablib\formats\_json.py", line 39, in import_set
dset.dict = json.loads(in_stream)
File "C:\Users\marialena\AppData\Local\Programs\Python\Python37\lib\site-packages\tablib\core.py", line 381, in _set_dict
if isinstance(pickle[0], list):
KeyError: 0
您也可以在输出中看到 API 响应。为什么 tablib 无法转换为 excel?
Dataset.json 期望收到序列化列表。问题中的代码正在传递一个序列化的dict
,这是错误的原因。
查看数据,字典中的value
键的值似乎是需要的,因此将其传递给数据集。
>>> import json
>>> import tablib
>>> d = {'count': 1, 'value': [{'id': 'ID', 'name': 'TFS', 'url': 'https://TFS/DefaultCollection/_apis/projects/PROJ', 'state': 'wellFormed', 'revision': 00, 'visibility': 'private'}]}
>>> ds = tablib.Dataset()
>>> ds.json = json.dumps(d['value'])
>>> with open('test.xlsx', 'wb') as f:
... f.write(ds.export('xlsx'))
我看到您在项目的问题跟踪器上提出了一个错误。虽然这种行为可以说不是错误,但如果代码发出更有意义的错误消息,那肯定是一种改进。
我正在尝试将调用 API 后得到的 JSON 响应转换为 excel 文件。我不需要添加特定的 headers 或只获取特定的数据,我只需要这个调用 returns.
的所有内容我找到了 tablib
library.
当我从 GitLab 获取数据时,我设法让它工作,但是在将我的有效负载更改为 Tfs 后,我收到一个错误,我不确定问题是什么或如何解决。
这是我的代码:
import requests
import urllib3
import json
from requests.packages.urllib3.exceptions import InsecureRequestWarning
import tablib
import datetime
import time
import os
class gitlab():
def get_closed():
url = "https://IP:443/DefaultCollection/_apis/projects"
payload = {}
querystring = {"api-version":"4.1"}
headers = {
'Content-Type': "application/json-patch+json",
'Authorization': "KEY"
}
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
response = requests.request(
"GET", url, headers=headers, data=payload, params=querystring, verify=False)
return json.loads(response.text)
if __name__ == "__main__":
list_b = gitlab.get_closed()
print(list_b)
data = tablib.Dataset()
data.json = json.dumps(list_b)
data_export = data.export('xlsx')
filename = os.path.dirname(os.path.realpath(__file__)) +'/closed_' + str(datetime.date.today()) + '.xlsx'
with open(filename, 'wb') as f:
f.write(data_export)
f.close()
使用 python script
执行,其中 python 的版本是 3.7.2
显示以下错误:
{'count': 1, 'value': [{'id': 'ID', 'name': 'TFS', 'url': 'https://TFS/DefaultCollection/_apis/projects/PROJ', 'state': 'wellFormed', 'revision': 00, 'visibility': 'private'}]}
Traceback (most recent call last): File ".\gitlab.py", line 94, in <module> data.json = json.dumps(list_with_bugs, indent=4, ensure_ascii=False) File "C:\Users\marialena\AppData\Local\Programs\Python\Python37\lib\site-packages\tablib\formats\_json.py", line 39, in import_set
dset.dict = json.loads(in_stream)
File "C:\Users\marialena\AppData\Local\Programs\Python\Python37\lib\site-packages\tablib\core.py", line 381, in _set_dict
if isinstance(pickle[0], list):
KeyError: 0
您也可以在输出中看到 API 响应。为什么 tablib 无法转换为 excel?
Dataset.json 期望收到序列化列表。问题中的代码正在传递一个序列化的dict
,这是错误的原因。
查看数据,字典中的value
键的值似乎是需要的,因此将其传递给数据集。
>>> import json
>>> import tablib
>>> d = {'count': 1, 'value': [{'id': 'ID', 'name': 'TFS', 'url': 'https://TFS/DefaultCollection/_apis/projects/PROJ', 'state': 'wellFormed', 'revision': 00, 'visibility': 'private'}]}
>>> ds = tablib.Dataset()
>>> ds.json = json.dumps(d['value'])
>>> with open('test.xlsx', 'wb') as f:
... f.write(ds.export('xlsx'))
我看到您在项目的问题跟踪器上提出了一个错误。虽然这种行为可以说不是错误,但如果代码发出更有意义的错误消息,那肯定是一种改进。