在Django中基于已有JSON输出生成CSV文件的实现疑问
问题描述
我现在碰到个技术问题:怎么基于已经生成的JSON输出创建CSV文件。目前我已经能生成JSON文件,但不知道怎么在同一个流程里同步生成CSV。可能是我放CSV代码的位置不对,或者Django需要特殊处理方式。
utils.py 导入部分
import json import os import pandas as pd import csv import urllib.parse
生成JSON的原有函数
def get_ip_list_json() -> dict: json_response = { "version": "", "description": "", "objects": [ { "name": "", "id": "", "description": "", "ranges": ["2.2.2.2"], }, ], } group_map = {} for ip in BlockedList.objects.filter( Q(end_date__isnull=True) | Q(end_date__gte=timezone.now()) ).select_related("group"): group_id = str(ip.group.id) if group_id not in group_map: group_map[group_id] = { "name": ip.group.name, "id": ip.group.group_id, "description": ip.group.description, "ranges": [], } group_map[group_id]["ranges"].append(ip.address) json_response["objects"] = list(group_map.values()) return json_response
编辑说明
下面是我参考Nayem的解决方案修改后的实现代码,只做了个性化调整,输出效果一致。
def create_ip_file(): try: base_dir = "" csv_filename = "" csv_full_path = os.path.join(base_dir, csv_filename) # 查询BlockedList中的所有条目 blockedlist = BlockedList.objects.all() data_for_csv = [] for obj in blockedlist: # 格式化结束日期为dd/mm/yyyy formatted_end_date = obj.end_date.strftime("%d/%m/%Y") # URL编码原因字段,替换逗号等特殊字符 encoded_reason = urllib.parse.quote(obj.reason) # 将数据添加到CSV转换列表 data_for_csv.append({ "NetworkAddress": obj.address, "Group": obj.group, "Reason": encoded_reason, "Expiry": formatted_end_date }) # 将列表转换为pandas DataFrame df = pd.DataFrame(data_for_csv) # 从DataFrame创建CSV文件 df.to_csv(csv_full_path, index=False) except Exception as e: # 打印发生的异常 print(e)
内容的提问来源于stack exchange,提问作者Steve-o
相关产品推荐
相关产品推荐

