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)
修正细节说明:
- 优化JSON读取:只打开一次JSON文件,避免重复IO操作,代码更高效。
- 调整CSV打开位置:把文件打开移到角色循环外,确保所有角色的数据都会追加写入,不会被覆盖。
- 增加容错处理:用
element.get('AttachedManagedPolicies', [])处理没有策略的角色,避免程序崩溃。 - 补充写入逻辑:明确调用
csv_file.write()把拼接好的行写入文件,加上换行符保证每行是独立的记录。 - 代码可读性优化:用f-string代替字符串拼接,变量名更清晰(比如把
s改成role_name)。
内容的提问来源于stack exchange,提问作者Milister
相关产品推荐
相关产品推荐

