此处的大多数示例都显示硬编码的列,而不是迭代。我有73列要迭代并在JSON中正确表达。
import csv
import json
CSV_yearly = r'C:\path\yearly.csv'
JSON_yearly = r'C:\path\json_yearly.json'
with open(CSV_yearly, 'r') as csv_file:
reader = csv.DictReader(csv_file)
with open(JSON_yearly, 'w') as json_file:
for row in reader:
json_file.write(json.dumps(row) + ',' + '\n')
print "done"
尽管这会创建一个json文件,但它执行不正确。我看到了一些示例,其中读者内部的一个参数要求一个列表,但我不想从csv中键入73列。我的猜测是代码行介于with
和reader
的开头。
答案 0 :(得分:3)
您的代码将文件中的每一行创建为单独的JSON对象(有时称为JsonL或json-lines格式)。收集列表中的行,然后序列化为JSON:
with open(CSV_yearly, 'r') as csv_file:
reader = csv.DictReader(csv_file)
with open(JSON_yearly, 'w') as json_file:
rows = list(reader)
json.dump(rows, json_file)
请注意,某些JSON使用者希望将对象而不是列表作为外部容器,在这种情况下,您的数据必须是
rows = {'data': list(reader)}
更新:来自评论的问题
csv.DictReader
使用标准的Python字典创建行,因此键的顺序在3.7之前的Python版本中是任意的。如果必须保留键顺序,请尝试使用OrderedDict:
from collections import OrderedDict
out = []
with open('mycsv.csv', 'rb') as f:
reader = csv.reader(f)
headings = next(reader) # Assumes first row is headings, otherwise supply your own list
for row in reader:
od = OrderedDict(zip(headings, row))
out.append(od)
# dump out to file using json module
请注意,尽管这可能会以所需的键顺序输出json,但不需要json的使用者尊重它。
来自csv的所有值都读取为字符串。如果要使用其他类型,则需要在从csv文件读取后执行必要的转换。