最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python實現(xiàn)將JSON轉(zhuǎn)換為CSV格式

 更新時間:2026年03月04日 08:24:34   作者:Eiceblue  
JSON(JavaScript??Object?Notation)和?CSV(Comma-Separated?Values)是數(shù)據(jù)交換和存儲中最常用的兩種格式,本文將詳細介紹如何使用Free?Spire.XLS?for?Python將JSON數(shù)據(jù)轉(zhuǎn)換為?CSV?文件,感興趣的小伙伴可以了解下

JSON(JavaScript Object Notation)和 CSV(Comma-Separated Values)是數(shù)據(jù)交換和存儲中最常用的兩種格式。JSON 以其靈活的結(jié)構(gòu)化表示方式廣泛應(yīng)用于 API 接口、配置文件等場景,而 CSV 則因其簡潔的表格形式在數(shù)據(jù)分析、電子表格處理和數(shù)據(jù)庫導(dǎo)入導(dǎo)出中占據(jù)主導(dǎo)地位。在實際工作中,我們經(jīng)常需要將 JSON 數(shù)據(jù)轉(zhuǎn)換為 CSV 格式,以便利用 Excel、Pandas 等工具進行進一步分析或可視化。

本文將詳細介紹如何使用免費庫 Free Spire.XLS for Python 將 JSON 數(shù)據(jù)轉(zhuǎn)換為 CSV 文件,涵蓋環(huán)境配置、基本轉(zhuǎn)換、嵌套數(shù)據(jù)處理以及常見問題的解決方案。

1. 環(huán)境準備

在開始之前,請確保您的 Python 環(huán)境已安裝以下依賴:

  • Python 3.6 或更高版本
  • Free Spire.XLS for Python 庫

使用 pip 安裝 Free Spire.XLS:

pip install Spire.XLS.Free

此外,我們還將使用 Python 標準庫中的 json 模塊處理 JSON 數(shù)據(jù)(無需額外安裝)。

2. 核心實現(xiàn):將 JSON 數(shù)據(jù)轉(zhuǎn)換為 CSV 文件

2.1 基礎(chǔ)場景:簡單 JSON 轉(zhuǎn) CSV

簡單 JSON 指無嵌套、鍵值對結(jié)構(gòu)統(tǒng)一的 JSON 數(shù)組(如[{"name":"張三","age":25}, ...]),是最基礎(chǔ)的轉(zhuǎn)換場景。

實現(xiàn)邏輯:

  • 讀取并解析 JSON 文件為 Python 列表;
  • 提取所有唯一鍵作為 CSV 表頭;
  • 初始化 Workbook/Worksheet 對象,寫入表頭和數(shù)據(jù);
  • 保存為 CSV 格式并釋放資源。

完整代碼:

import json
from spire.xls import *
from spire.xls.common import *

def simple_json_to_csv(json_path: str, csv_path: str) -> None:
    """
    簡單結(jié)構(gòu)JSON轉(zhuǎn)CSV(無嵌套)
    :param json_path: 輸入JSON文件路徑
    :param csv_path: 輸出CSV文件路徑
    """
    try:
        # 1. 讀取并解析JSON數(shù)據(jù)
        with open(json_path, 'r', encoding='utf-8') as f:
            json_data = json.load(f)
        
        # 校驗數(shù)據(jù)格式(必須是包含字典的列表)
        if not isinstance(json_data, list) or not all(isinstance(item, dict) for item in json_data):
            raise ValueError("JSON數(shù)據(jù)需為「包含字典的列表」格式")
        
        # 2. 提取表頭(去重)
        headers = []
        for item in json_data:
            for key in item.keys():
                if key not in headers:
                    headers.append(key)
        
        # 3. 初始化Excel工作簿和工作表
        workbook = Workbook()
        worksheet = workbook.Worksheets[0]
        
        # 4. 寫入表頭(第一行)
        for col_idx, header in enumerate(headers, start=1):
            worksheet.Range[1, col_idx].Text = header
        
        # 5. 寫入數(shù)據(jù)行(從第二行開始)
        for row_idx, item in enumerate(json_data, start=2):
            for col_idx, header in enumerate(headers, start=1):
                # 處理空值,避免KeyError
                cell_value = item.get(header, "")
                worksheet.Range[row_idx, col_idx].Text = str(cell_value)
        
        # 6. 保存為CSV并釋放資源
        worksheet.SaveToFile(csv_path, ",", Encoding.get_UTF8())
        workbook.Dispose()
        print(f"轉(zhuǎn)換完成!CSV文件路徑:{csv_path}")
    
    except Exception as e:
        print(f"轉(zhuǎn)換失敗:{str(e)}")

# 測試調(diào)用
if __name__ == "__main__":
    # 示例test.json內(nèi)容:
    # [{"name":"張三","age":25,"city":"北京"},{"name":"李四","age":30,"city":"上海"}]
    simple_json_to_csv("test.json", "simple_result.csv")

關(guān)鍵代碼解釋:

  • json.load():將 JSON 文件解析為 Python 原生數(shù)據(jù)結(jié)構(gòu)(列表/字典);
  • worksheet.Range[row, col]:Free Spire.XLS 的單元格定位方式,行/列從1開始計數(shù);
  • Dispose():釋放 Workbook 占用的內(nèi)存資源,避免內(nèi)存泄漏。

轉(zhuǎn)換結(jié)果:

2.2 進階場景:嵌套 JSON 轉(zhuǎn) CSV

實際業(yè)務(wù)中 JSON 常包含嵌套結(jié)構(gòu)(如 {"name":"張三","info":{"age":25,"city":"北京"}}),直接轉(zhuǎn)換會丟失嵌套數(shù)據(jù),需先將嵌套字典“扁平化”。

實現(xiàn)邏輯:

  • 編寫遞歸函數(shù)扁平化嵌套字典;
  • 解析 JSON 并應(yīng)用扁平化處理;
  • 后續(xù)步驟同基礎(chǔ)場景。

完整代碼:

import json
from spire.xls import *
from spire.xls.common import *

def flatten_dict(nested_dict: dict, parent_key: str = '', sep: str = '_') -> dict:
    """
    遞歸扁平化嵌套字典
    :param nested_dict: 待扁平化的嵌套字典
    :param parent_key: 父鍵名(遞歸使用)
    :param sep: 鍵名分隔符(如info_age)
    :return: 扁平化后的單層字典
    """
    items = []
    for k, v in nested_dict.items():
        new_key = f"{parent_key}{sep}{k}" if parent_key else k
        if isinstance(v, dict):
            # 遞歸處理嵌套層級
            items.extend(flatten_dict(v, new_key, sep).items())
        else:
            items.append((new_key, v))
    return dict(items)

def nested_json_to_csv(json_path: str, csv_path: str) -> None:
    """
    嵌套結(jié)構(gòu)JSON轉(zhuǎn)CSV
    :param json_path: 輸入JSON文件路徑
    :param csv_path: 輸出CSV文件路徑
    """
    try:
        # 1. 讀取并解析JSON
        with open(json_path, 'r', encoding='utf-8') as f:
            json_data = json.load(f)
        
        # 2. 扁平化所有嵌套字典
        flattened_data = []
        for item in json_data:
            flattened_item = flatten_dict(item)
            flattened_data.append(flattened_item)
        
        # 3. 提取表頭(扁平化后的鍵)
        headers = []
        for item in flattened_data:
            for key in item.keys():
                if key not in headers:
                    headers.append(key)
        
        # 4. 初始化工作簿并寫入數(shù)據(jù)(同基礎(chǔ)場景)
        workbook = Workbook()
        worksheet = workbook.Worksheets[0]
        
        # 寫入表頭
        for col_idx, header in enumerate(headers, start=1):
            worksheet.Range[1, col_idx].Text = header
        
        # 寫入扁平化數(shù)據(jù)
        for row_idx, item in enumerate(flattened_data, start=2):
            for col_idx, header in enumerate(headers, start=1):
                cell_value = item.get(header, "")
                worksheet.Range[row_idx, col_idx].Text = str(cell_value)
        
        # 保存并釋放資源
        worksheet.SaveToFile(csv_path, ",", Encoding.get_UTF8())
        workbook.Dispose()
        print(f"嵌套JSON轉(zhuǎn)換完成!CSV文件路徑:{csv_path}")
    
    except Exception as e:
        print(f"轉(zhuǎn)換失?。簕str(e)}")

# 測試調(diào)用
if __name__ == "__main__":
    # 示例nested_test.json內(nèi)容:
    # [{"name":"張三","info":{"age":25,"job":{"title":"工程師"}}},{"name":"李四","info":{"age":30,"job":{"title":"產(chǎn)品經(jīng)理"}}}]
    nested_json_to_csv("nested_test.json", "nested_result.csv")

關(guān)鍵代碼解釋:

  • flatten_dict:核心遞歸函數(shù),將嵌套鍵拼接為單層(如info_job_title),解決嵌套數(shù)據(jù)丟失問題;
  • 扁平化后的數(shù)據(jù)處理邏輯與基礎(chǔ)場景一致,保證 CSV 結(jié)構(gòu)規(guī)整。

轉(zhuǎn)換結(jié)果:

3. 常見問題與解決方案

3.1 中文亂碼問題

  • 現(xiàn)象:CSV 文件用 Excel 打開后中文顯示亂碼;
  • 解決方案:轉(zhuǎn)換時指定了 UTF-8 編碼,若 Excel 兼容問題,可將 CSV 用記事本打開,“另存為” 選擇 “UTF-8-BOM” 編碼。

3.2 特殊字符導(dǎo)致格式錯亂

現(xiàn)象:換行符、制表符導(dǎo)致 CSV 單元格錯位;

解決方案:寫入前轉(zhuǎn)義特殊字符:

cell_value = str(cell_value).replace('\n', ' ').replace('\r', ' ').replace('\t', ' ')

4. 總結(jié)

通過結(jié)合 Python 的 json 模塊進行數(shù)據(jù)解析,并利用 Free Spire.XLS 強大的工作表操作能力,我們可以靈活地處理嵌套結(jié)構(gòu)、自定義扁平化策略,并最終生成符合預(yù)期的 CSV 文件。該方法特別適合需要與 Excel 工作流緊密結(jié)合的場景,或者當需要在同一個項目中同時處理 Excel 和 CSV 格式時。

到此這篇關(guān)于Python實現(xiàn)將JSON轉(zhuǎn)換為CSV格式的文章就介紹到這了,更多相關(guān)Python JSON轉(zhuǎn)CSV內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論

罗定市| 盐源县| 扬中市| 安福县| 察隅县| 新竹市| 阜城县| 广汉市| 军事| 锦州市| 阿合奇县| 萨嘎县| 建水县| 内乡县| 额济纳旗| 漯河市| 安化县| 武穴市| 韶山市| 大埔县| 昌邑市| 清流县| 灵丘县| 陇西县| 东山县| 中西区| 庐江县| 绿春县| 玉田县| 镇康县| 景东| 巴塘县| 长治市| 淮北市| 囊谦县| 定远县| 高台县| 长汀县| 胶南市| 南丹县| 永清县|