我有一个带有 jsonb 字段的模型,其中存储来自第三方服务的响应。响应周期性变化;有些字段被添加,有些字段消失。我想从记录样本生成 CSV。为此,我需要从示例中收集所有可能的字段并将它们转换为 CSV 文件中的列。
为此,您需要迭代示例记录,从 JSONB 字段中提取所有唯一键,然后使用这些键在 CSV 文件中创建列。以下是您可以在 Python 中遵循的分步方法:
import json
import csv
from collections import defaultdict
# Sample records with JSONB field
sample_records = [
{"id": 1, "data": {"key1": "value1", "key2": "value2"}},
{"id": 2, "data": {"key2": "value2", "key3": "value3"}},
{"id": 3, "data": {"key1": "value1", "key4": "value4"}}
]
# Extract all unique keys from the JSONB field
all_keys = set()
for record in sample_records:
data = record.get("data", {})
all_keys.update(data.keys())
# Create CSV file and write header
with open('output.csv', 'w', newline='') as csvfile:
fieldnames = ['id'] + list(all_keys) # Include 'id' column and unique keys
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
writer.writeheader()
# Write data rows
for record in sample_records:
row = {'id': record['id']}
data = record.get("data", {})
row.update(data) # Add data fields
writer.writerow(row)
print("CSV file generated successfully.")
此脚本迭代示例中的每条记录,从 JSONB 字段中提取键,并更新包含所有唯一键的集合。然后,它创建一个 CSV 文件,并使用“id”列和所有唯一键作为列名称写入标题。最后,它再次迭代示例记录,将每条记录写入 CSV 文件,并为每列提供相应的值。
您可以将sample_records替换为从数据库中检索到的实际样本数据。此外,请确保根据您的具体要求和数据的性质处理任何潜在的错误或边缘情况。