Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 读取CSV并输出json。需要设置数据类型_Python_Json_Csv - Fatal编程技术网

Python 读取CSV并输出json。需要设置数据类型

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

我有一个项目,我正在读取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,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_字段中}正确吗?完整的代码可以工作,非常感谢。虽然很奇怪,但我用你发布的内容替换了它,一切都很好。再次感谢!