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

How to convert a csv file into a json formatted file?

此处的大多数示例显示的是硬编码列,而不是迭代。我有 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 文件,但它做错了。我看到 reader 中的参数请求列表的示例,但我不想从 csv 中输入 73 列。我的猜测是代码行位于 withreader 之间。

您的代码将文件中的每一行创建为单独的 JSON 对象(有时称为 JsonL 或 json 行格式)。收集列表中的行,然后序列化为 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 文件后执行必要的转换。