Python 读取CSV并输出json。需要设置数据类型
我有一个项目,我正在读取CSV并输出到json 以下是一些示例CSV:Python 读取CSV并输出json。需要设置数据类型,python,json,csv,Python,Json,Csv,我有一个项目,我正在读取CSV并输出到json 以下是一些示例CSV: firstName,lastName,email,age,gender John,Doe,jdoe@emaildomain.com,50,male Jane,Doe,jdoe@emaildomain.com,28,female Bill,Smith,bsmith@emaildomain.com,49,male Dick,Tracy,dtracy@emaildomain.com,18,male Peter,Parker,ppa
firstName,lastName,email,age,gender
John,Doe,jdoe@emaildomain.com,50,male
Jane,Doe,jdoe@emaildomain.com,28,female
Bill,Smith,bsmith@emaildomain.com,49,male
Dick,Tracy,dtracy@emaildomain.com,18,male
Peter,Parker,pparker@emaildomain.com,26,male
Clark,Kent,ckent@emaildomain.com,17,male
Wonder,Woman,wwoman@emaildomain.com,44,female
John,James,jjames@emaildomain.com,17,male
Kat,Whoaman,kwhoamans@emaildomain.com,23,female
在输出方面,一切都如我所希望的那样工作,除了我需要在输出中将某些值设置为整数,但它们以字符串的形式输出(例如age)。有没有一种方法可以让我大部分的代码保持得体,但将某些值作为整数而不是字符串输出
导入json
导入csv
进口itertools
主_字段=['email']
结果=[]
打开('SampleCSV.csv')作为csv\u文件:
reader=csv.DictReader(csv_文件,skipinitialspace=True)
对于itertools.islice(读卡器,5)中的行:
d={k:v代表k,v在row.items()中,如果k在primary_字段中}
d['dataFields']=[{k:v,}表示k,v在行中。items()如果k不在主字段中]
结果.追加(d)
根={}
root[“用户”]=结果
打印(json.dumps(根,缩进=4))
样本输出:
{
"users": [
{
"email": "jdoe@emaildomain.com",
"dataFields": [
{
"firstName": "John"
},
{
"lastName": "Doe"
},
{
"age": "50"
},
{
"gender": "male"
}
]
}
]
}
期望输出:
{
"users": [
{
"email": "jdoe@emaildomain.com",
"dataFields": [
{
"firstName": "John"
},
{
"lastName": "Doe"
},
{
"age": 50
},
{
"gender": "male"
}
]
}
]
}
这就是我刚才提到的。注释掉的行是您的原始代码
import json
import csv
import itertools
primary_field = ['email']
result = []
with open('SampleCSV.csv') as csv_file:
reader = csv.DictReader(csv_file, skipinitialspace=True)
for row in itertools.islice(reader, 5):
d = {k: v for k, v in row.items() if k in primary_field}
# d['dataFields'] = [{k: v,} for k, v in row.items() if k not in primary_field]
tmp_list = []
for k,v in row.items():
if k not in primary_field:
try:
vint = int(v)
except ValueError:
vint = v
tmp_list.append({k: vint})
d['dataFields'] = tmp_list
result.append(d)
root = {}
root["users"] = result
print(json.dumps(root, indent=4))
给出结果
{
"users": [
{
"email": "jdoe@emaildomain.com",
"dataFields": [
{
"firstName": "John"
},
{
"lastName": "Doe"
},
{
"age": 50
},
{
"gender": "male"
}
]
}, ...
我正在复习这个问题,忍不住给你提了个建议。请尝试将字段转换为整数int()。如果有效,则使用结果变量。如果没有,那就坚持到底。看看这个答案:@Spinor8我承认我是这方面的一个n00b。除了在for循环中针对行还是针对变量v之外,我会进行尝试吗?或者完全在其他地方?请参阅下面的答案。我尝试运行它时遇到以下错误:tmp_list=[]^TabError:缩进中制表符和空格的使用不一致。嗯,它应该缩进到与注释行相同的级别。如果有帮助的话,我可以用你所有的原始代码重新发布。嗯,确实是这样。注释行上方的行应该仍然存在:
code
d={k:v代表k,v在row.items()中,如果k在primary_字段中}正确吗?完整的代码可以工作,非常感谢。虽然很奇怪,但我用你发布的内容替换了它,一切都很好。再次感谢!