Python值与标头不匹配
我正在将CSV文件转换为以下格式的JSON CSV文件:Python值与标头不匹配,python,json,python-3.x,Python,Json,Python 3.x,我正在将CSV文件转换为以下格式的JSON CSV文件: name, email, date, phone john, example.com, 26/11/18, 123 john, hello.com, 12/08/18, 123456 错误结果: [ { "name": "john", "email": "example.com", "items": [ { "phone": "example.c
name, email, date, phone
john, example.com, 26/11/18, 123
john, hello.com, 12/08/18, 123456
错误结果:
[
{
"name": "john",
"email": "example.com",
"items": [
{
"phone": "example.com",
"info": {
"date": "example.com",
}
},
]
},
]
代码:
预期格式:
[
{
"name": "john",
"email": "example.com",
"items": [
{
"phone": "123",
"info": {
"date": "26/11/18",
}
},
]
},
]
k为标题,v为值。因此,您可以看到所有行的值都将重复,并且与标题不匹配。在第二个循环中,该值将复制所有标题的日期,依此类推 Maximilian Peters指出了为什么您的代码在注释中不起作用。一般来说,我会避免所有这些,并手动构建每个字典
import csv
result = []
with open("student.csv", "r") as csv_ledger:
for row in csv.DictReader(csv_ledger, skipinitialspace=True):
result.append({
"name": row["name"],
"email": row["email"],
"items": [{
"phone": row["phone"],
"info": {"date": row["date"]},
}],
})
这是必要的,因为您发布的csv在每个逗号后都有空格。这种方法过于复杂,结果可能会以严格的方式构造。您只需从字典中获取随机值,而不验证键是否正确。您不需要循环,也不需要过滤,只需直接从行['phone']和行['date']中绘制即可。{'phone':v,'info':{'date':v}}:您对两个不同的键使用了两次v。可能是这导致了您的问题?好吧,如果我这样做d['items']=[{k:v代表k,v在行中。items如果k在primary_fields2}]。结果完全匹配,但我需要插入info对象以包含日期感谢您的回答,我使用该方法的原因是结果必须进行分组数据。顺便说一句,是否可以将顶级数组[]转换为对象{}?@BebekimLim我不明白分组数据是什么意思。也许分两步做会更容易些?一个步骤是将csv转换为我发布的代码所在的词典列表,然后迭代您刚刚创建的词典列表并对它们进行分组或其他操作。或者你可以问另一个问题,提供关于你实际试图解决的问题的更多细节。当然,这是可能的,只需将其更改为result={}并更改result。将{附加到result[无论你的密钥应该是什么]={并将最后一个}更改为}。
import csv
result = []
with open("student.csv", "r") as csv_ledger:
for row in csv.DictReader(csv_ledger, skipinitialspace=True):
result.append({
"name": row["name"],
"email": row["email"],
"items": [{
"phone": row["phone"],
"info": {"date": row["date"]},
}],
})