python - 使用 python 将 Excel 转换为 JSON 格式
问题描述
我有一个以下格式的 excel 表
我想使用 Python 将此 Excel 表转换为 JSON 格式。每个 JSON 对象都是以下格式的对角线值和列标题。
{
"Records": [
{
"RecordId": "F1",
"Assets": [
{
"AssetId": "A1",
"Support": "S11"
},
{
"AssetId": "A2",
"Support": "S12"
},
{
"AssetId": "A3",
"Support": "S13"
}
]
},
{
"RecordId": "F2",
"Assets": [
{
"AssetId": "A1",
"Support": "S21"
},
{
"AssetId": "A2",
"Support": "S22"
},
{
"AssetId": "A3",
"Support": "S23"
}
]
}
]
}
我写了一些代码,它似乎没有按我的预期工作。
import json
import pandas as pd
df = pd.read_excel (r'test.xlsx', sheet_name='Sheet2')
#initialize data
data=[0 for i in range(len(df))]
datac=[0 for c in range(len(df.columns))]
newset=dict()
for i in range(len(df)):
# data[i] = r'{"'+str(df.columns.values[0])+'": "' +str(df.loc[i][0])+'", '+str(df.columns.values[1])+'": "' +str(df.loc[i][1])+'", '+str(df.columns.values[2])+'": "' +str(df.loc[i][2])+'"}'
#data[i] = {str(df.columns.values[1]) : str(df.loc[i][0]), str(df.columns.values[1]): str(df.loc[i][1]), str(df.columns.values[2]): str(df.loc[i][2])}
for c in range(1,len(df.columns)):
#data[i] = {str('RecordId') : str(df.loc[i][0]),str('Assets'):[{"AssetId": str(df.columns.values[c]),"Support": str(df.loc[i][c])}]}
datac[c] = {"AssetId": str(df.columns.values[c]),"Support": str(df.loc[i][c])}
data[i]={str('RecordId') : str(df.loc[i][0]),str('Assets'):datac[c]}
print(data[i])
output_lines = [json.dumps(line)+",\n" for line in data]
output_lines[-1] = output_lines[-1][:-2] # remove ",\n" from last line
with open(r'Savedwork.json', 'w') as json_file:
json_file.writelines(output_lines)
解决方案
您需要的是iterrows()
方法,它将作为(索引,系列)对迭代数据框的行。该columns()
方法将为您提供列名列表,因此您将能够遍历系列中的列,并按名称访问它们。
import json
import pandas as pd
df = pd.read_excel('test.xlsx')
recs = []
for i, row in df.iterrows():
rec = {
'RecordId': row[0],
'Assets': [{'AssetId': c, 'Support': row[c]} for c in df.columns[1:]]
}
recs.append(rec)
out = {'Records': recs}
(是的,这一切都可以在一个列表理解中完成,但滥用这些会妨碍可读性)
此外,你不需要json.dumps
在行上做,然后用换行符组装它们(不要在文本级别工作):用整个数据构建一个字典,然后 json.dump :
print(json.dumps(out, indent=4))
推荐阅读
- ios - 我正在使用 VIPER 并尝试实现自定义 NavBarController
- html - 我怎样才能把我的两个在同一个路线上?
- amazon-web-services - 从 AWS S3 清单报告中排除对象
- javascript - 如何在 React 上重新渲染相同的组件?
- javascript - 可点击按钮上方的父 Box-shadow
- c# - UWP 与多个平台之间的 Socket 通信
- java - 使用 SAX Parser Java 正确构建字符串
- php - 在自定义页面上显示 Woocommerce 付款方式(条纹)
- python - Dask read_csv 无法从 BytesIO 读取
- django - 在mixin中的Django rest框架modelserializer(write_only && read_write)中添加添加字段