繁体   English   中英

如何创建基于 CSV 的没有标题的 json 文件

[英]How to create a json file based on CSV with no headers

我有一个像这样的 csv 文件:

'3', '8948', 'f678'
'3', '5654', 'f644'
'6', '5567', 'g3335'
'9', '4467', 'g3356'
'9', '7666', 'h4433'

CSV 拥有各种记录。 第一列代表一个 ID 字段。

我已经遍历 CSV 文件并将行添加到列表中。

然后,我使用该列表制作了 JSON 文件。 看起来像这样:

[
    [
        "3",
        "8948",
        "f678"
    ],
    [
        "3",
        "5654",
        "f644"
    ],
    [
        "6",
        "5567",
        "g3335"
    ]
     ...

但据我了解,我将无法从此 JSON 读取并对其执行任务? 从我所见,我需要它作为字典,但是如何从我的 CSV 制作字典,特别是因为 ID 字段是重复的并且不会是唯一的。 唯一的其他选择是只使用一个行号,如果这是正确的 - 我如何从我的 CSV 创建一个带有行号的字典?

没有第三方库解决方案:

import json
from csv import DictReader

with open("tmp/1.csv", "r") as f_in, open("tmp/result.json", "w") as f_out:
    dict_reader = DictReader(f_in, fieldnames=["field1", "field2", "field3"])
    json.dump(list(dict_reader), f_out)

但是,如果这不是要应用于此表数据的唯一转换,则convtools库中有Table helper ( docs | github )。

import json
from convtools.contrib.tables import Table

results = list(
    Table.from_csv(
        "tmp/1.csv", header=["field1", "field2", "field3"]
    ).into_iter_rows(dict)
)

with open("tmp/result.json", "w") as f:
    json.dump(results, f)

我猜你的代码到目前为止看起来像这样:

import csv
import json

data: list[list[str]] = []
with open("input.csv", newline="") as f_in:
    reader = csv.reader(f_in)
    for row in reader:
        data.append(row)

with open("data.json", "w") as f_out:
    json.dump(data, f_out, indent=2)

为了解决您关于此 JSON 是否有效的第一个问题/疑虑...

更大的概念是 Python 的 json 模块产生有效的 JSON。 如果在您转储数据时模块没有抱怨什么,那么 JSON 就很好。

但为了更直接地解决您的问题,JSON 可能看起来像很多不同的东西:

print(json.dumps(1))
print(json.dumps("A"))
print(json.dumps({}))
print(json.dumps([]))

这些转储()中的每一个都会产生有效的 JSON。 我不知道如何正式证明这些是有效的,但我确实相信Python 的 json 模块之类的工具(它已经过多年实际使用的审查,可能在全世界都经过了审查)。 我还去了https://jsonlint.com/并直接输入了这些简单的示例并为所有人获得了“有效 JSON”。

现在,如何处理您拥有的 JSON?

您可以按原样处理它,也可以通过自己提供列名/键来创建所需的结构(假设您知道数据代表什么):

data_keyed: list[dict[str, Any]] = []
with open("input.csv", newline="") as f_in:
    reader = csv.reader(f_in)
    for row in reader:
        data_row = {"Col1": row[0], "Col2": row[1], "Col3": row[2]}
        data_keyed.append(data_row)

with open("data_keyed.json", "w") as f_out:
    json.dump(data_keyed, f_out, indent=2)

现在我们得到:

[
  {
    "Col1": "3",
    "Col2": "8948",
    "Col3": "f678"
  },
  {
    "Col1": "3",
    "Col2": "5654",
    "Col3": "f644"
  },
  ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM