我是 python 的新手,我必须按以下格式将 csv 文件转换为 json:
CSV 文件:
firstname, lastname, email, customerid, dateadded, customerstatus
john, doe, john.doe@do.com, 124,26/11/18,active
jane, doe, jane.doe@do.com, 125,26/11/18,active
JSON 格式:
{
firstname: "John",
lastname: "Doe",
emailOrPhone: "john.doe@do.com",
extraFields: [{
name: "customerid",
value: "124"
},
{
name: "dateadded",
value: "26/11/18"
},
{
name: "dateadded",
value: "26/11/18"
}
]
}, {
firstname: "Jane",
lastname: "Doe",
emailOrPhone: "Jane.doe@do.com",
extraFields: [{
name: "customerid",
value: "125"
},
{
name: "dateadded",
value: "26/11/18"
},
{
name: "dateadded",
value: "26/11/18"
}
]
}
current code I am using:
import requests
import json
import time
import csv
import json
import glob
import os
import logging
for filename in glob.glob('D:\\api\\Extract.csv'):
csvfile = os.path.splitext(filename)[0]
jsonfile = csvfile + '.json'
with open(csvfile+'.csv') as f:
reader = csv.DictReader(f)
rows = list(reader)
with open(jsonfile, 'w') as f:
json.dump(rows, f)
url = 'api_url'
with open("D:\\api\\Extract.json", "r") as read_file:
data = json.load(read_file)
for item in data:
headers = {"Authorization" : "key", "Content-Type" : "application/json"}
r = requests.post(url, data= json.dumps(item), headers= headers)
logging.basicConfig(level=logging.DEBUG,
format='%(asctime)s %(message)s',
handlers=[logging.FileHandler("D:\\api\\log_file.log"),
logging.StreamHandler()])
我可以在 json 中生成父值,但我不确定如何获取子节点并将列名解析为值并像这样遍历整个文件。
上面的代码将csv转换为简单的json对象,我想实现嵌套对象。我想也许追加将是解决方案,但不知道如何将列作为值和相应的数据作为值传递。
最佳答案
您可以使用 csv.DictReader
这使您可以在迭代每一行时访问列名。然后您可以按如下方式构建每个项目:
import json
import csv
primary_fields = ['firstname', 'lastname', 'email']
result = []
with open('mydata.csv') as csv_file:
reader = csv.DictReader(csv_file, skipinitialspace=True)
for row in reader:
d = {k: v for k, v in row.items() if k in primary_fields}
d['extraFields'] = [{'name': k, 'value': v} for k, v in row.items() if k not in primary_fields]
result.append(d)
print(json.dumps(result, indent=2))
输出
[
{
"firstname": "john",
"lastname": "doe",
"email": "john.doe@do.com",
"extraFields": [
{
"name": "customerid",
"value": "124"
},
{
"name": "dateadded",
"value": "26/11/18"
},
{
"name": "customerstatus",
"value": "active"
}
]
},
{
"firstname": "jane",
"lastname": "doe",
"email": "jane.doe@do.com",
"extraFields": [
{
"name": "customerid",
"value": "125"
},
{
"name": "dateadded",
"value": "26/11/18"
},
{
"name": "customerstatus",
"value": "active"
}
]
}
]
如果您想在最终的 json 中设置自定义字段名称(例如
emailOrPhone
用于 email
),您始终可以手动为 d
设置字段名称并设置适当的值
关于python - 将 csv 转换为 json(嵌套对象),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53474118/