遍历Python字典列表并扁平化文件时遇NoneType下标错误求解决
问题解决:Asana项目数据扁平化及NoneType错误修复
问题背景
遍历包含多个项目字典的列表进行数据扁平化时,出现'NoneType' object is not subscriptable错误,同时需要保留custom_fields中的更多字段(如gid),最终期望输出为每个自定义字段对应一行项目主数据的格式。
错误原因
- NoneType访问错误:当项目的
current_status为null时,pd.json_normalize尝试访问其下的子字段(如原代码中大小写不匹配的Color),触发空对象下标访问错误。 - DataFrame合并无效:使用
Flatten_file.append()不会修改原DataFrame,该方法返回新对象但未被赋值,最终输出为空。 - 字段缺失:原请求和扁平化配置未包含
custom_fields.gid,导致该字段丢失。
修复后的完整代码
import asana import pandas as pd # 初始化Asana客户端 client = asana.Client.access_token('Access_token') # 获取组合中的项目列表 portfolio_items = client.portfolios.get_items_for_portfolio( 'Portfolio_id', opt_fields=['gid'], opt_pretty=True ) Project_list = pd.DataFrame(portfolio_items) project_details = [] # 遍历获取每个项目的详细数据 for (index, row_data) in Project_list.iterrows(): project_object = client.projects.get_project( project_gid=row_data["gid"], opt_fields=[ 'gid', 'name', 'start_on', 'archived', 'completed', 'completed_at', 'created_at', 'current_status.color', 'current_status.created_at', 'current_status.modified_at', 'custom_fields.gid', 'custom_fields.name', 'custom_fields.display_value' # 新增自定义字段ID ], opt_pretty=True ) project_details.append(project_object) # 初始化扁平化结果DataFrame Flatten_file = pd.DataFrame() if project_details: # 遍历每个项目进行扁平化 flatten_dfs = [] for project in project_details: flatten_df = pd.json_normalize( project, record_path=['custom_fields'], meta=[ 'gid', 'name', 'start_on', 'archived', 'completed', 'completed_at', 'created_at', # 使用点路径访问嵌套字段,配合errors='ignore'处理null情况 'current_status.color', 'current_status.created_at', 'current_status.modified_at' ], errors='ignore', # 忽略空嵌套字段的访问错误 meta_prefix='meta-', record_prefix='custom-' ) flatten_dfs.append(flatten_df) # 使用concat合并所有扁平化后的子DataFrame Flatten_file = pd.concat(flatten_dfs, ignore_index=True) # 打印结果 print(Flatten_file)
关键修改点说明
- 字段补充:在
opt_fields中添加custom_fields.gid,确保自定义字段的ID被保留。 - 嵌套字段处理:将meta中的嵌套字段路径改为点格式(如
current_status.color),并保留errors='ignore',避免current_status为null时触发错误。 - 有效合并DataFrame:改用
pd.concat收集并合并所有扁平化后的子DataFrame,替代无效的append操作。 - 字段大小写匹配:将原代码中的
Color修正为color,与实际数据字段名一致。
输出示例
基于提供的示例数据,修复后输出的结构如下(部分字段展示):
| custom-gid | custom-name | custom-display_value | meta-gid | meta-name | meta-current_status.color |
|---|---|---|---|---|---|
| 279970056320993 | Priority | null | 324673284 | Hawkeye Anecdote Escalation Model | null |
| 1202467628629378 | Size ( PXT-BI ) | Large | 324673284 | Hawkeye Anecdote Escalation Model | null |
| 1202467628629378 | Size ( PXT-BI ) | Small | 3878432832 | Create Data Connection For New Conversions Dashboard | null |
| 1202475692803938 | Project Type ( PXT-BI ) | null | 3878432832 | Create Data Connection For New Conversions Dashboard | null |
内容的提问来源于stack exchange,提问作者Ananth Popuri
相关产品推荐
相关产品推荐

