2017-03-18 35 views
1

我使用twitter的API下载原始推文,以便我可以与他们一起玩。他们在给例如迭代循环看起来像这样(我加了一个条件,如果运行循环n次,这里没有显示):将原始推文字符串转换为Python中的JSON对象

iterator = twitter_stream.statuses.sample() 
for tweet in iterator: 
    print (json.dumps(tweet)) 
    break 

这些命令输出格式正确整个JSON对象。

要提取从原始鸣叫JSON对象“文本”项目,我尝试使用获得(“文本”)运营的

txts = [] 
for tweet in iterator: 
    txts.append((json.dumps(tweet)).get("text")) 
    break 
print (txts) 

,但我得到一个错误说“AttributeError的:“海峡'object has no attribute'get'“

所以我搜索了一遍,发现了一个解决方案,他们将json.dumps(tweet)的所有输出写入文件,将json.loads(jsonfile)用于变量,并且试图使用它的.get(“文本”)操作符来加载文本:

fl = open("ipjson.json", "a") 
for tweet in iterator: 
    fl.write(json.dumps(tweet)) 
    break 
fl.flush() 
decode = json.loads(fl) 

for item in decode: 
    txt = item.get("text") 
    txts.append(txt) 
print (txts) 

但是这给了我另一个错误说:“TypeError:JSON对象必须是str,而不是'TextIOWrapper'”

我在做什么错?是否有更好/更简单的方法从原始推文JSON对象中提取文本?

+1

你能否提供'print(json.dumps(tweet))'的输出并指出你想从那里得到什么确切的数据? – niemmi

+1

您不应该需要执行转储然后加载。该信息可能已经在推特变量中。 –

回答

1

对于你不需要JSON你可以在第一个例子只是做:

txts = [] 
for status in statuses: 
    txts.append(status.text) 

在第二个例子中,你会不正确地处理JSON。而应该做的:

txts = [] 
for status in statuses: 
    txts.append(json.dumps(status)) 

with open('ipjson.json','w') as fou: 
    json.dump(txts,fou) 

并读取它放回:

with open('ipjson.json','r') as fin: 
    txts = json.load(fin) 

for txt in txts: 
    print(json.loads(txt)['text']) 

请注意,当你写和读的JSON使用转储负载但与您使用的单个JSON对象转储加载

相关问题