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

遍历Python字典列表并扁平化文件时遇NoneType下标错误求解决

问题解决:Asana项目数据扁平化及NoneType错误修复

问题背景

遍历包含多个项目字典的列表进行数据扁平化时,出现'NoneType' object is not subscriptable错误,同时需要保留custom_fields中的更多字段(如gid),最终期望输出为每个自定义字段对应一行项目主数据的格式。

错误原因

  1. NoneType访问错误:当项目的current_status为null时,pd.json_normalize尝试访问其下的子字段(如原代码中大小写不匹配的Color),触发空对象下标访问错误。
  2. DataFrame合并无效:使用Flatten_file.append()不会修改原DataFrame,该方法返回新对象但未被赋值,最终输出为空。
  3. 字段缺失:原请求和扁平化配置未包含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)

关键修改点说明

  1. 字段补充:在opt_fields中添加custom_fields.gid,确保自定义字段的ID被保留。
  2. 嵌套字段处理:将meta中的嵌套字段路径改为点格式(如current_status.color),并保留errors='ignore',避免current_status为null时触发错误。
  3. 有效合并DataFrame:改用pd.concat收集并合并所有扁平化后的子DataFrame,替代无效的append操作。
  4. 字段大小写匹配:将原代码中的Color修正为color,与实际数据字段名一致。

输出示例

基于提供的示例数据,修复后输出的结构如下(部分字段展示):

custom-gidcustom-namecustom-display_valuemeta-gidmeta-namemeta-current_status.color
279970056320993Prioritynull324673284Hawkeye Anecdote Escalation Modelnull
1202467628629378Size ( PXT-BI )Large324673284Hawkeye Anecdote Escalation Modelnull
1202467628629378Size ( PXT-BI )Small3878432832Create Data Connection For New Conversions Dashboardnull
1202475692803938Project Type ( PXT-BI )null3878432832Create Data Connection For New Conversions Dashboardnull

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 06:15:20