在python中为单个键:值对将.csv格式化为json
我正在尝试将csv文档中的单个键:值对格式化为JSON,并使用JSON.dump()。虽然它在大多数情况下似乎工作得很好,但它正在将我的整数转换为字符串(或者可能我需要将字符串转换为整数,具体取决于它的外观),这是我不想要的,而且我还需要一个键:值对来成为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')
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,我可以看到这是如何工作的。非常感谢。