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

如何合并Twitter API返回的两个字典键值并追加写入CSV文件

报错原因

TypeError: list indices must be integers or slices, not str触发原因是Twitter API返回结构中,data(推文列表)和users(用户列表)是响应根目录下平级的两个数组字段,不存在data下嵌套users的结构。你写的json_response['data']['users']相当于对列表类型的data字段传入字符串键'users'取值,不符合列表的索引规则,直接抛出类型错误。

实现代码

核心逻辑是先把用户列表转换为以用户ID为键的映射表,遍历推文时直接通过author_id匹配对应用户信息,按指定列顺序写入CSV即可,代码如下:

import csv

# 此处json_response为Twitter API返回的已解析JSON对象
# 构建用户ID到用户信息的映射,避免双层循环匹配
user_id_map = {user["id"]: user for user in json_response.get("users", [])}

# 严格按照需求指定CSV列顺序
CSV_FIELDS = ["author id", "id", "tweet", "location", "username"]
SAVE_PATH = "tweet_data.csv"

# 追加写入模式,配置编码避免乱码,newline参数适配csv模块官方要求
with open(SAVE_PATH, mode="a", newline="", encoding="utf-8-sig") as csv_file:
    writer = csv.DictWriter(csv_file, fieldnames=CSV_FIELDS)
    # 首次写入文件时取消下面两行注释,自动写入表头
    # if csv_file.tell() == 0:
    #     writer.writeheader()

    # 遍历所有推文,匹配作者信息后写入行
    for tweet in json_response.get("data", []):
        author_id = tweet["author_id"]
        author = user_id_map.get(author_id, {})
        writer.writerow({
            "author id": author_id,
            "id": tweet["id"],
            "tweet": tweet["text"],
            "location": author.get("location", ""),
            "username": author.get("username", "")
        })
注意事项
  • 采用ID映射的方式做关联,时间复杂度为O(n+m),数据量大时比嵌套循环效率高很多
  • 所有字段取值都加了兜底逻辑,遇到接口返回字段缺失、作者信息匹配失败的情况不会中断脚本,对应位置留空即可
  • 如果需要每次采集覆盖旧文件,把文件打开模式从"a"改成"w",同时放开表头写入的逻辑即可
  • 写入的示例行效果完全符合要求:123,1234,This is a tweet,Earth,example_username

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.09 16:15:43