我有以下代码来迭代我的CSV值。输入数据(Sample.csv
):
name,city
jack,nj
matt,ny
并在JSON中创建输出。所需的输出
[
{"name": "jack","city": "PA"},
{"name": "matt","city": "CA"}
]
代码输出:
[{"name,city": "jack,PA"};{"name,city": "matt,CA"};]
代码示例:
#!/usr/bin/python
import json
import csv
csvfile = open('sample.csv', 'r')
jsonfile = open('sample.csv'.replace('.csv','.json'), 'w')
jsonfile.write('{\n[\n')
fieldnames = csvfile.readline().replace('\n','').split(';')
reader = csv.DictReader(csvfile, fieldnames, delimiter=';')
from collections import OrderedDict
for row in reader:
json.dump(OrderedDict([(f, row[f]) for f in fieldnames]), jsonfile, indent=4)
jsonfile.write(';\n')
jsonfile.write(']\n}')
最终输出未对齐到键值对。
答案 0 :(得分:0)
我能够实现我所需要的,可能不是最好的解决方案,但肯定是我现在正在寻找的。
import sys, getopt
ifile=''
ofile=''
format=''
#get argument list using sys module
myopts, args = getopt.getopt(sys.argv[1:],"i:o:f")
for o,a in myopts:
if o == '-i':
ifile=a
elif o == '-o':
ofile=a
elif o == '-f':
format=a
else:
print("Usage: %s -i input -o output -f format" % sys.argv[0])
#Reset the output file for each run
reset = open(ofile,"w+")
reset.close()
#Read CSV in a ordered Column Format & output in JSON format
from collections import OrderedDict
import csv
import json
import os
with open(ifile,'r') as f:
reader = csv.reader(f,delimiter=',', quotechar='"')
headerlist = next(reader)
for row in reader:
d = OrderedDict()
for i, x in enumerate(row):
print x
d[headerlist[i]] = x
with open(ofile,'a') as m:
if format == "pretty":
m.write(json.dumps(d, sort_keys=False, indent=4, separators=(',', ': '),encoding="utf-8",ensure_ascii=False))
m.write(',\n')
else:
m.write(json.dumps(d))
m.write(',\n')
#Module to remove the trailing delimiter
file = open(ofile, "r+")
file.seek(0, os.SEEK_END)
pos = file.tell() - 1
while pos > 0 and file.read(1) != ",":
pos -= 1
file.seek(pos, os.SEEK_SET)
if pos > 0:
file.seek(pos, os.SEEK_SET)
file.truncate()
file.writelines('\n')
file.close()