[英]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.