我是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对象,我想实现嵌套对象。我在想也许追加将是解决方案,但不确定如何将列作为值传递而将相应的数据作为值传递。
答案 0 :(得分:3)
您可以使用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
的{{1}}),则始终可以手动为email
设置字段名称并设置适当的值>
答案 1 :(得分:2)
稍微复杂一些,但没有必要,但是您可以尝试在从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 :
[
{
"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"
}
]
答案 2 :(得分:0)
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:])
用法:
python csv2json.py myCSVfile.txt
其中myCSVfile.txt是您的CSV文件(根据您的喜好命名)。
它将在名为myCSVfile.json的文件中创建JSON数组
仅此而已。