簡體   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