Python 将csv转换为json(嵌套对象)
我是python新手,我必须以以下格式将csv文件转换为json: CSV文件:Python 将csv转换为json(嵌套对象),python,json,Python,Json,我是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:
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对象,我想实现嵌套对象。我在想也许追加是解决方案,但不确定如何将列作为值传递,并将相应的数据作为值传递。您可以使用它在迭代每一行时访问列名。然后,您可以按如下方式构建每个项目:
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
foremail
),您始终可以手动设置d
的字段名,并设置适当的值,设置的复杂度略高于需要,但您可以在从csv文件读取值时尝试构建json数组,然后将结果输出到一个.json
文件中,并在末尾添加json.dump
:
from csv import reader
from json import dump
top_fields = ["firstname", "lastname", "email"]
extra_fields = ["customerid", "dateadded", "customerstatus"]
data = []
with open("customers.csv") as csv_in:
csv_reader = reader(csv_in)
# Get headers
headers = list(map(str.strip, next(csv_reader)))
for row in csv_reader:
json_object = {}
# Build dictionary for each row
row_map = dict(zip(headers, map(str.strip, row)))
# Add in top fields first
for top in top_fields:
json_object[top] = row_map[top]
# Then add in extra fields
for extra in extra_fields:
json_object.setdefault("extraFields", []).append(
{"name": extra, "value": row_map[extra]}
)
data.append(json_object)
with open("customers.json", "w") as fp:
dump(data, fp, indent=4, sort_keys=True)
这将提供以下customers.json:
用法:
python csv2json.py myCSVfile.txt
其中myCSVfile.txt是您的CSV文件(根据您的喜好命名)
它将在名为myCSVfile.JSON的文件中创建一个JSON数组
就这些。你能分享你的代码吗?这样我们就可以从那里更新它了。我在上面的问题中添加了我的代码。这可能没有帮助,因为我正在将csv直接转换为json
[
{
"email": "john.doe@do.com",
"extraFields": [
{
"name": "customerid",
"value": "124"
},
{
"name": "dateadded",
"value": "26/11/18"
},
{
"name": "customerstatus",
"value": "active"
}
],
"firstname": "john",
"lastname": "doe"
},
{
"email": "jane.doe@do.com",
"extraFields": [
{
"name": "customerid",
"value": "125"
},
{
"name": "dateadded",
"value": "26/11/18"
},
{
"name": "customerstatus",
"value": "active"
}
],
"firstname": "jane",
"lastname": "doe"
}
]
import csv
import sys
import json
#EDIT THIS LIST WITH YOUR REQUIRED JSON KEY NAMES
fieldnames=["firstname","secondname","age"]
def convert(filename):
csv_filename = filename[0]
print "Opening CSV file: ",csv_filename
f=open(csv_filename, 'r')
csv_reader = csv.DictReader(f,fieldnames)
json_filename = csv_filename.split(".")[0]+".json"
print "Saving JSON to file: ",json_filename
jsonf = open(json_filename,'w')
data = json.dumps([r for r in csv_reader])
jsonf.write(data)
f.close()
jsonf.close()
if __name__=="__main__":
convert(sys.argv[1:])