如何将csv文件转换为json格式的文件?

时间:2019-04-22 20:59:45

标签: python json loops csv python-2.x

此处的大多数示例都显示硬编码的列,而不是迭代。我有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列。我的猜测是代码行介于withreader的开头。

1 个答案:

答案 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的使用者尊重它。

  • 您还知道为什么将json中的值转换为字符串而不保留为数字或没有括号的原因吗?

来自csv的所有值都读取为字符串。如果要使用其他类型,则需要在从csv文件读取后执行必要的转换。