如何将CSV文件转换为多行JSON?

这是我的代码,非常简单的东西。

import csv
import json

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

fieldnames = ("FirstName","LastName","IDNumber","Message")
reader = csv.DictReader( csvfile, fieldnames)
out = json.dumps( [ row for row in reader ] )
jsonfile.write(out)

声明一些字段名,阅读器使用CSV来读取文件,并使用归档名将文件转储为JSON格式。问题出在这里...

CSV文件中的每条记录都在不同的行上。我希望JSON的输出也是这样。问题是它把所有的内容都转储在一个巨大的长行上。

我试着用类似 "for line in csvfile: "的方法,然后用 "reader = csv.DictReader( line, fieldnames) "来运行我下面的代码,它在每一行中循环,但它在一行中完成整个文件,然后在另一行中循环整个文件...一直到它没有行了。

有什么建议可以纠正这个问题吗?

编辑:为了澄清,目前我有:(第1行的每条记录)

[{"FirstName":"John","LastName":"Doe","IDNumber":"123","Message":"None"},{"FirstName":"George","LastName":"Washington","IDNumber":"001","Message":"Something"}]

我在寻找什么?(2行的2条记录)

{"FirstName":"John","LastName":"Doe","IDNumber":"123","Message":"None"}
{"FirstName":"George","LastName":"Washington","IDNumber":"001","Message":"Something"}

不是每个字段都缩进/放在单独的一行,而是每个记录都放在自己的一行。

一些输入示例。

"John","Doe","001","Message1"
"George","Washington","002","Message2"
解决办法

你想要的输出的问题是,它不是有效的json文档,它是一个流的json文档!

这没关系,如果你需要的话,但这意味着对于你想要输出的每一个文档,你都必须调用json.dumps

由于你想要的分隔文件的换行并不包含在这些文件中,你必须自己提供换行。 因此,我们只需要从调用json.dump的循环中抽出,为每一个写入的文档插入换行。

import csv
import json

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

fieldnames = ("FirstName","LastName","IDNumber","Message")
reader = csv.DictReader( csvfile, fieldnames)
for row in reader:
    json.dump(row, jsonfile)
    jsonfile.write('\n')
评论(6)

json.dumps中增加`indent'参数。

 data = {'this': ['has', 'some', 'things'],
         'in': {'it': 'with', 'some': 'more'}}
 print(json.dumps(data, indent=4))

还要注意的是,你可以简单地使用json.dump,并打开jsonfile

json.dump(data, jsonfile)
评论(1)
import csv
import json
csvfile = csv.DictReader('filename.csv', 'r'))
output =[]
for each in csvfile:
    row ={}
    row['FirstName'] = each['FirstName']
    row['LastName']  = each['LastName']
    row['IDNumber']  = each ['IDNumber']
    row['Message']   = each['Message']
    output.append(row)
json.dump(output,open('filename.json','w'),indent=4,sort_keys=False)
评论(4)