簡體   English   中英

將帶有嵌套標頭的 CSV 轉換為 JSON

[英]Convert CSV with nested headers to JSON

到目前為止,我有這個代碼(在教程的幫助下):

import csv, json

csvFilePath = "convertcsv.csv"
jsonFilePath = "newResult.json"

# Read the CSV and add the data to a dictionary...
data = {}

with open(csvFilePath) as csvFile:
    csvReader = csv.DictReader(csvFile)
    for csvRow in csvReader:
        data = csvRow

# Write data to a JSON file...
with open(jsonFilePath, "w") as jsonFile:
    jsonFile.write(json.dumps(data, indent=4))

我想要的輸出是這樣的:

{
  "userID": "string", 
  "username": "string", 
  "age": "string",
  "location": {
    "streetName": "string", 
    "streetNo": "string", 
    "city": "string"
  }
}

我不知道如何表示“位置”。

我的實際結果是這樣的:

{
    "userID": "string", 
    "username": "string", 
    "age": "string",
    "location/streetName": "string", 
    "location/streetNo": "string", 
    "location/city": "string", 
}

如何將 streetName、streetNo 和 city 分開並將它們放入“位置”?

我會添加一些自定義邏輯來實現這一點,請注意,這僅適用於第一級,如果您想要更多,您應該創建一個遞歸函數:

# Write data to a JSON file...
with open(jsonFilePath, "w") as jsonFile:
    for i, v in data.items():
        if '/' in i:
            parts = i.split('/', 1)
            data[parts[0]] = {parts[1]: v}
            data.pop(i)

    jsonFile.write(json.dumps(data, indent=4))

下面是一個簡單的腳本應該做你想做的。 結果將是一個以“userID”為鍵的 json 對象。 請注意,為了測試更深層次的嵌套,我使用了一個標題略有不同的 csv 文件 - 但它與您的原始示例一樣有效。

import csv, json

infile = 'convertcsv.csv'
outfile = 'newResult.json'

data = {}

def process(header, value, record):
    key, other = header.partition('/')[::2]
    if other:
        process(other, value, record.setdefault(key, {}))
    else:
        record[key] = value

with open(infile) as stream:
    reader = csv.DictReader(stream)
    for row in reader:
        data[row['userID']] = record = {}
        for header, value in row.items():
            process(header, value, record)

with open(outfile, "w") as stream:
    json.dump(data, stream, indent=4)

輸入

userID,username,age,location/street/name,location/street/number,location/city
0,AAA,20,This Street,5,This City
1,BBB,42,That Street,5,That City
2,CCC,34,Other Street,5,Other City

輸出

{
    "0": {
        "userID": "0",
        "username": "AAA",
        "age": "20",
        "location": {
            "street": {
                "name": "This Street",
                "number": "5"
            },
            "city": "This City"
        }
    },
    "1": {
        "userID": "1",
        "username": "BBB",
        "age": "42",
        "location": {
            "street": {
                "name": "That Street",
                "number": "5"
            },
            "city": "That City"
        }
    },
    "2": {
        "userID": "2",
        "username": "CCC",
        "age": "34",
        "location": {
            "street": {
                "name": "Other Street",
                "number": "5"
            },
            "city": "Other City"
        }
    }
}

你可以使用這樣的東西:

# https://www.geeksforgeeks.org/convert-csv-to-json-using-python/

import csv 
import json 
  
  
# Function to convert a CSV to JSON 
# Takes the file paths as arguments 
def make_json(csvFilePath, jsonFilePath): 
      
    # create a dictionary 
    data = {} 
      
    # Open a csv reader called DictReader 
    with open(csvFilePath, encoding='utf-8') as csvf: 
        csvReader = csv.DictReader(csvf) 
          
        # Convert each row into a dictionary  
        # and add it to data 
        for rows in csvReader: 
              
            # Assuming a column named 'No' to 
            # be the primary key 
            key = rows['No'] 
            data[key] = rows 
  
    # Open a json writer, and use the json.dumps()  
    # function to dump data 
    with open(jsonFilePath, 'w', encoding='utf-8') as jsonf: 
        jsonf.write(json.dumps(data, indent=4)) 
          
# Driver Code 
  
# Decide the two file paths according to your  
# computer system 
csvFilePath = r'Names.csv'
jsonFilePath = r'Names.json'
  
# Call the make_json function 
make_json(csvFilePath, jsonFilePath)

有關更多信息,請查看https://www.geeksforgeeks.org/convert-csv-to-json-using-python/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM