这是我的代码,非常简单的东西。
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')
在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)
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)