使用_json将推文写入JSON文件时遭遇AttributeError问题求助
解决AttributeError: 'SearchResults' object has no attribute '_json'问题
嘿,这个问题我之前也碰到过,咱们一步步来搞定它!
错误原因分析
你遇到的问题主要出在两个地方:
- 列表添加方式错误:
api.search()返回的是SearchResults对象(本质是包含多个Tweet的可迭代集合),但你用了searched_tweets.append(new_tweets),这会把整个SearchResults集合作为单个元素塞进列表里。之后遍历searched_tweets时,你其实在尝试序列化整个集合,而不是单个Tweet对象,自然会找不到_json属性。 - Tweet对象不可直接序列化:即使拿到单个Tweet对象,直接用
json.dump(tweet, f)也不行,因为Twitter API返回的Tweet对象是自定义类实例,不是JSON可序列化的类型,得用它自带的_json属性获取可序列化的字典。
修正后的代码
import json searched_tweets = [] new_tweets = api.search(q=query, count=remaining_tweets, since_id=str(since_id), max_id=str(max_id)) # 用extend代替append,把每个Tweet对象单独加入列表 searched_tweets.extend(new_tweets) def write_tweets(tweets, filename): with open(filename + ".json", "w") as f: for tweet in tweets: # 序列化Tweet对象的_json属性(这是一个可序列化的字典) json.dump(tweet._json, f) f.write('\n') write_tweets(searched_tweets, "testfile")
关键改动说明
extend替代append:extend()会把new_tweets里的每个Tweet对象逐个添加到searched_tweets列表中,而不是把整个集合作为一个元素添加,这样后续遍历的时候拿到的就是单个Tweet对象。- 使用
tweet._json:每个Tweet对象的_json属性存储了该推文的所有数据(以Python字典形式),这个字典可以直接被json.dump()序列化写入文件。
如果之后你需要更美观的JSON格式(比如换行缩进),也可以给json.dump()加上indent参数:
json.dump(tweet._json, f, indent=2)
内容的提问来源于stack exchange,提问作者SeyiA
相关产品推荐
相关产品推荐

