在python中为单个键:值对将.csv格式化为json

在python中为单个键:值对将.csv格式化为json,python,json,csv,Python,Json,Csv,我正在尝试将csv文档中的单个键:值对格式化为JSON,并使用JSON.dump()。虽然它在大多数情况下似乎工作得很好,但它正在将我的整数转换为字符串(或者可能我需要将字符串转换为整数,具体取决于它的外观),这是我不想要的,而且我还需要一个键:值对来成为JSON数组 目前我的代码基本上是这样的: import csv import json csvfile = open('spreadsheet.csv', 'r') jsonfile = open('fileTo.json', 'w')

我正在尝试将csv文档中的单个键:值对格式化为JSON,并使用JSON.dump()。虽然它在大多数情况下似乎工作得很好,但它正在将我的整数转换为字符串(或者可能我需要将字符串转换为整数,具体取决于它的外观),这是我不想要的,而且我还需要一个键:值对来成为JSON数组

目前我的代码基本上是这样的:

import csv
import json

csvfile = open('spreadsheet.csv', 'r')
jsonfile = open('fileTo.json', 'w') 

fieldnames = ("Id","name","TypeId","Type", "listHere")
reader = csv.DictReader( csvfile, fieldnames)

for row in reader:
    json.dump(row, jsonfile, sort_keys=True, indent=4, separators=(',', ':'))
    jsonfile.write(',')
    jsonfile.write('\n') 
其中,我需要Id和TypeId是整数,listHere成为JSON数组

目前,输出如下:

[
    {
        "name":"someName",
        "Id":"1",
        "Type":"someType",
        "TypeId":"2",
        "listHere":"someList"
    },
]
我需要的是:

 [
    {
        "name":"someName",
        "Id":1,
        "Type":"someType",
        "TypeId":2,
        "listHere":
        [
             "someList"
        ]       
    },
]

我通读了这些文档,但没有真正了解如何使用包含数千条条目的电子表格。任何帮助都将不胜感激。谢谢

csv
不支持列类型,尽管那会很好

以下代码(未测试)对某些字段具有“fixer”函数。在将每一行转换为JSON之前,使用fixer函数转换一些字段的值<代码>整数(字段)在这种情况下

注意:虽然每一行都作为JSON输出,但整个列表不是。目前它有一个尾随“,”。考虑使用将数据“流”到JSON文件

import csv
import json

csvfile = open('spreadsheet.csv', 'r')
jsonfile = open('fileTo.json', 'w') 

fieldnames = ("Id","name","TypeId","Type", "listHere")
fieldfixers = {
    'Id': int,
    'Type': int,
}
reader = csv.DictReader( csvfile, fieldnames)

for row in reader:
    for key,value in row.iteritems():
        ffunc = fieldfixers.get(key)
        if ffunc:
            row[key] = ffunc(value)
    json.dump(row, jsonfile, sort_keys=True, indent=4, separators=(',', ':'))
    jsonfile.write(',')
    jsonfile.write('\n') 

当您使用csv模块阅读项目时,它们总是以字符串值的形式显示。感谢您的确认,这正是我所想的。太棒了,感谢您的输入,它解决了整数问题。将“listHere”转换为JSON数组有什么诀窍吗?@shavenwarthog您可以使用
defaultdict
使其更干净,如所示。我不会发布一个单独的答案,因为这只是一个清理。(注意,我省略了顶部的字段名/其他仪式。)感谢@syrion的替代方法。我对python非常熟悉,所以仍然在学习所有的技巧。此外,我仍然不知道如何生成我的最后一个字段,以便它显示为JSON数组…@v3rbal如果您的最后一列是单个字段中的一个列表——比方说一个由逗号分隔的整数列表,在csv中显示为
“1,2,3”
——您也可以为它生成一个transformer函数。在我的pastebin中,您可以将
'listHere':lambda x:map(int,x.split(','))
添加到
更新
调用的字典参数中。啊,再次感谢@syrion,我可以看到这是如何工作的。非常感谢。