Python實現(xiàn)將JSON轉(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)文章
Python Tricks 使用 pywinrm 遠程控制 Windows 主機的方法
這篇文章主要介紹了Python Tricks 使用 pywinrm 遠程控制 Windows 主機的方法,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-07-07
Python中使用PyHook監(jiān)聽鼠標和鍵盤事件實例
這篇文章主要介紹了Python中使用PyHook監(jiān)聽鼠標和鍵盤事件實例,這個庫依賴于另一個Python庫PyWin32,并且只能運行在Windows平臺,需要的朋友可以參考下2014-07-07
Python簡單實現(xiàn)兩個任意字符串乘積的方法示例
這篇文章主要介紹了Python簡單實現(xiàn)兩個任意字符串乘積的方法,結(jié)合實例形式分析了Python針對字符串、列表的切片、轉(zhuǎn)換、遍歷等相關(guān)操作技巧,需要的朋友可以參考下2018-04-04
Python自動調(diào)整PPT文本框內(nèi)容防止溢出的代碼實現(xiàn)
在自動化處理PPT時,文本框內(nèi)容溢出是一個常見問題,本文將分享一個Python腳本,通過計算文本框容量自動截斷文本并添加省略號,確保內(nèi)容適配文本框尺寸,代碼基于python-pptx庫,適用于批量處理PPT模板,需要的朋友可以參考下2025-04-04

