You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python问题:可在终端打印结果但无法写入CSV文件

问题描述

我可以将结果打印到终端,但无法成功写入CSV文件。相关代码如下:

datapath = '1.json'
data = json.load(open(datapath))
with open('1.json') as file:
    data = json.load(file)
for element in data['RoleDetailList']:
    if 'RoleName' in element.keys():
        s = element['RoleName']
        #print s
        with open('roleassign.csv', 'wt') as file:
            file.write('Role,Policy\n')
            for policy in element['AttachedManagedPolicies']:
                c = s + ',' + policy['PolicyName']
                #print c
问题分析与解决方案

嘿,我看了你的代码,问题很明确——你现在能打印但写不了CSV,主要是两个小问题搞的鬼:

  • 文件打开位置错误:你把CSV文件的打开操作放在了角色的循环里面,这意味着每处理一个角色,就会重新创建/覆盖roleassign.csv,之前写入的内容全没了,最后只会保留最后一个角色的数据(甚至可能因为逻辑没写完啥都没有)。
  • 缺少实际写入操作:代码里只拼接了字符串c,但既没执行打印(注释掉了),也没调用file.write()把内容写入文件,等于白忙活一场。

这里给你修正后的代码,顺便优化了一些细节:

import json

datapath = '1.json'
# 只需要读取一次JSON文件,避免重复打开浪费资源
with open(datapath) as json_file:
    data = json.load(json_file)

# 把CSV文件的打开放在最外层,确保只创建/写入一次,不会覆盖之前的内容
with open('roleassign.csv', 'wt') as csv_file:
    # 先写入表头
    csv_file.write('Role,Policy\n')
    for element in data['RoleDetailList']:
        # 检查RoleName是否存在,直接用in判断更简洁
        if 'RoleName' in element:
            role_name = element['RoleName']
            # 用get方法获取策略列表,避免没有策略时抛出KeyError
            for policy in element.get('AttachedManagedPolicies', []):
                # 用f-string拼接更清晰,每行加上换行符保证CSV格式正确
                row = f"{role_name},{policy['PolicyName']}\n"
                # 执行写入操作
                csv_file.write(row)

修正细节说明:

  1. 优化JSON读取:只打开一次JSON文件,避免重复IO操作,代码更高效。
  2. 调整CSV打开位置:把文件打开移到角色循环外,确保所有角色的数据都会追加写入,不会被覆盖。
  3. 增加容错处理:用element.get('AttachedManagedPolicies', [])处理没有策略的角色,避免程序崩溃。
  4. 补充写入逻辑:明确调用csv_file.write()把拼接好的行写入文件,加上换行符保证每行是独立的记录。
  5. 代码可读性优化:用f-string代替字符串拼接,变量名更清晰(比如把s改成role_name)。

内容的提问来源于stack exchange,提问作者Milister

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:50:10