【发布时间】:2020-11-22 13:35:51
【问题描述】:
我正在开发一个从 CSV 读取购买数据并为 API 有效负载输出 JSON 的项目。有多行具有相同的订单 ID,因为每一行都有一个单独的项目,我想在创建购买负载之前将这些项目组合成一个数组。
order id name product_code purchase_price
012006251700-68811 item1 321618 1380
012006251700-68811 item1 321618 690
012006241026-13750 item2 329452 1490
012006221101-40527 item3 326353 1990
012006221101-40527 item4 321625 1490
012006192158-63823 item5 323098 1990
012006192158-63823 item6 320923 590
012006192158-63823 item7 325051 590
012006192158-63823 item8 325446 1990
我已经能够从 CSV 导入行,并且正在检查当前购买的 ID 值,但无法获得我想要的结果。
下面的代码应该检查下一行的 ID 值是否相同,如果是,则只将项目详细信息添加到项目数组中。
如果下一行没有相同的 ID,else 语句会将完整的购买添加到购买数组中。
import csv
import json
output = {'purchases': []}
items = {'items': []}
purchaseBody = {}
current_purchase = None
with open('tester - tester.csv') as csv_file:
for purchase in csv.DictReader(csv_file):
if current_purchase is not None and purchase['id'] == current_purchase['id']:
items['items'].append({'id': purchase['id'],
'name': purchase['name'],
'product_code': purchase['product_code']
'purchase_price': purchase['purchase_price'],
})
else:
purchaseBody = {
'id': purchase['id'],
'user': {'email': purchase['email']},
'total': purchase['total'],
'createdAt': purchase['createdAt']
}
items['items'].append({'id': purchase['id'],
'name': purchase['name'],
'product_code': purchase['product_code']
'purchase_price': purchase['purchase_price'],
})
output['purchases'].append(purchaseBody)
items = {'items': []}
purchaseBody.update(items)
current_purchase = purchase
with open('file.json', 'w') as jsonfile:
json.dump(output, jsonfile, ensure_ascii=False)
jsonfile.write('\n')
所需的输出应类似于以下内容:
{
"purchases": [{
"id": "purchase id",
"user": {
"email": "email"
},
"items": [{
"id": "id1",
"name": "name1",
"additionalFields": {
"product_code": "product_code1",
"purchase_price": "purchase_price1"
}
},
{
"id": "id2",
"name": "name2",
"additionalFields": {
"product_code": "product_code2",
"purchase_price": "purchase_price2"
}
}
],
"total": "total",
"createdAt": "createdAt"
}]
}
【问题讨论】:
-
您的代码一次循环遍历
csv的行。因此,您无法检查下一行。但是您可以检查当前行是否与上一行匹配。 -
预期输出中的某些字段未反映在 csv 中。请更新示例 csv 以反映它应包含的所有信息。
标签: python json csv json-normalize