Python无法访问JSON的data属性 写入CSV仅表头无内容如何解决
问题原因及解决方法
你遇到的仅写入表头无数据的问题,核心原因大概率是以下几点,按优先级排查修改即可:
1. 校验搜索词列表有效性
你当前读取search_terms.txt的逻辑没有做非空校验,也未自动关闭文件句柄,如果文件路径错误、文件内容全是空行,会导致terms列表为空,后续遍历搜索的逻辑完全不执行,自然没有数据写入。
修改后读取文件的代码如下:
terms = [] # 用with上下文管理器自动关闭文件,避免资源泄漏 with open("search_terms.txt", "r", encoding="utf-8") as f: for line in f: stripped_line = line.strip() # 跳过空行 if stripped_line: terms.append(stripped_line) # 校验搜索词列表非空 if not terms: raise Exception("未加载到有效搜索词,请检查search_terms.txt文件路径和内容")
2. 修复URL构造逻辑
你当前手动拼接URL的方式没有对搜索词做URL编码,如果搜索词包含空格、&、#等特殊字符,会导致请求参数无效,API返回结果无匹配内容,没有data字段。修改请求逻辑,用requests自带的params参数自动处理编码:
def search_twitter(query, bearer_token = BEARER_TOKEN): headers = {"Authorization": "Bearer {}".format(bearer_token)} url = "https://api.twitter.com/2/tweets/search/recent" # 用params参数自动做URL编码,避免特殊字符导致请求异常 params = { "query": query, "tweet.fields": "text" } response = requests.get(url, headers=headers, params=params) print(f"请求{query}的响应状态码:{response.status_code}") if response.status_code != 200: raise Exception(response.status_code, response.text) return response.json()
3. 增加data字段存在性校验
当搜索词无匹配推文时,Twitter API返回的JSON中不会包含data字段,直接访问会抛出KeyError,修改写入CSV的循环逻辑,增加校验:
with open("tweets.csv", "w", newline="", encoding="utf-8") as f_out: writer = csv.writer(f_out) writer.writerow(["Search Term", "Tweet"]) for term in terms: json_response = search_twitter(query=term, bearer_token=BEARER_TOKEN) # 先判断data字段存在且不为空再遍历 if "data" in json_response and len(json_response["data"]) > 0: for entry in json_response["data"]: writer.writerow([term, entry["text"]]) else: print(f"搜索词[{term}]无匹配结果,跳过写入")
额外注意事项
- 确认你的Bearer Token已开通Twitter API v2的搜索权限,且未超出请求频次限制
- 运行代码时观察控制台打印的响应内容,确认API是否正常返回推文数据
内容的提问来源于stack exchange,提问作者Jimmy Friedman
相关产品推荐
相关产品推荐

