??本文介紹基于Python,讀取JSON文件數(shù)據(jù),并將JSON文件中指定的鍵值對數(shù)據(jù)轉換為.csv格式文件的方法。
??在之前的文章Python將JSON數(shù)據(jù)轉換為.csv格式等的表格中,我們就介紹過將JSON文件數(shù)據(jù)保存到.csv格式或.xlsx格式的表格文件中的方法;而本文我們將針對不同的待提取數(shù)據(jù)特征,給出另一種方法。
??首先,我們來明確一下具體的需求。我們現(xiàn)有一個JSON文件數(shù)據(jù),是一個包含多個JSON對象的列表,如下圖所示;其中,我們希望將text中的內(nèi)容提取出來——text中的數(shù)據(jù)都是以鍵值對的形式存儲的,我們希望的是,將鍵值對的鍵作為.csv格式文件的列名,而值則是這一列對應的值;因為這個JSON數(shù)據(jù)中包含很多個text(每一個text中的所有鍵都是一樣的,但是值不完全一致),所以我們最后就會得到一個具有很多行的.csv格式文件。

??明確了需求,我們就可以開始代碼的撰寫。本文所用代碼如下。
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Fri Sep 15 11:12:01 2023
@author: fkxxgis
"""
import json
import csv
json_file = "/Users/ddd/Downloads/single.json"
with open(json_file, 'r') as file:
data = json.load(file)
fieldnames = set()
for item in data:
fieldnames.update(json.loads(item['text']).keys())
csv_filename = "/Users/didi/Downloads/output.csv"
with open(csv_filename, 'w', newline='') as csvfile:
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
writer.writeheader()
for item in data:
json_string = item['text']
row_data = json.loads(json_string)
writer.writerow(row_data)
??其中,我們首先通過import語句導入必要的Python模塊,包括用于處理JSON數(shù)據(jù)的json和用于處理CSV文件的csv。
??接下來,我們打開名為single.json的JSON文件并讀取其內(nèi)容,將其存儲在data變量中。json.load(file)用于將JSON文件內(nèi)容加載到Python數(shù)據(jù)結構中。隨后,創(chuàng)建一個空集合fieldnames,用于存儲將在CSV文件的頭部寫入的列名。
??緊接著,我們遍歷data列表中的每個元素,其中每個元素是一個包含JSON格式的字符串的字典。對于每個元素,將JSON文本——也就是item['text']解析為字典,并獲取該字典中的所有鍵。這些鍵將被添加到fieldnames集合中,以便稍后在CSV文件的頭部(列名稱)使用。
??其次,創(chuàng)建一個CSV文件output.csv以進行寫入,使用csv.DictWriter對象初始化,其中指定了要寫入的列名(通過fieldnames變量)。使用writer.writeheader()寫入CSV文件的頭部,這將包含字段名稱。最后,遍歷data列表中的每個元素,對于每個元素,將JSON文本解析為字典,并將該字典的數(shù)據(jù)寫入CSV文件中,每行對應一個JSON對象。
??執(zhí)行上述代碼,我們即可在指定的結果.csv格式文件中看到我們轉換之后的數(shù)據(jù)結果;如下圖所示。其中,紫色框內(nèi)部分就是列名,也就是我們提取出來的鍵,而值則是每一行的數(shù)據(jù)。

??至此,大功告成。