流式发送推文时Json.dump()不工作
大家早上好,流式发送推文时Json.dump()不工作,json,python-3.x,tweepy,Json,Python 3.x,Tweepy,大家早上好, 我正在和我的twitter机器人狂欢——我需要将流式推文(以json格式发送)转储到一个文件中。 我以前是通过将其编写为utf8格式的字符串来实现这一点的,但是现在我仍然需要过滤一些数据,因此将其作为json存储在文件中似乎是最简单的方法。 我相应地编辑了代码: from tweepy.streaming import StreamListener from tweepy import OAuthHandler from tweepy import Stream import da
我正在和我的twitter机器人狂欢——我需要将流式推文(以json格式发送)转储到一个文件中。 我以前是通过将其编写为utf8格式的字符串来实现这一点的,但是现在我仍然需要过滤一些数据,因此将其作为json存储在文件中似乎是最简单的方法。 我相应地编辑了代码:
from tweepy.streaming import StreamListener
from tweepy import OAuthHandler
from tweepy import Stream
import datetime
import json
access_token = #####
access_token_secret = #####
consumer_key = #####
consumer_secret = #####
class StdOutListener(StreamListener):
def on_status(self, status):
print(status)
today = datetime.datetime.now()
with open('/git/twttrbots/data/Twitter_Raw %s' %
today.strftime("%a-%Y-%m-%d"), 'a') as f:
json.dump(status, f) # <- doesn't work
#f.write(json.dumps(status)) # <- doesn't work
#f.write("Blah") # <- works perfectly fine
if __name__ == '__main__':
while True:
try:
#login using auth
l = StdOutListener()
auth = OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)
stream = Stream(auth, l)
#filter by hashtag
stream.filter(track=['bitcoin', 'cryptocurrency', 'wonderlandcoin',
'btc', 'fintech', 'satoshi', 'blockchain',
'litecoin', 'btce'])
except:
print("Whoops, dicsonnected at %s. Retrying"
% datetime.datetime.now())
continue
从tweepy.streaming导入StreamListener
从tweepy导入OAuthHandler
从tweepy导入流
导入日期时间
导入json
访问令牌=#####
访问令牌密码
消费者密钥=#####
消费者的秘密
类StdOutListener(StreamListener):
def on_状态(自身、状态):
打印(状态)
今天=datetime.datetime.now()
打开('/git/twttrbots/data/Twitter_原始%s'%
今天。strftime(“%a-%Y-%m-%d”),“a”)作为f:
json.dump(status,f)#我必须做的一个初步观察(因为当我试图运行这个脚本时它变得令人沮丧):
不要将except子句太宽泛,这样会捕获所有内容(包括KeyboardInterrupt
),并且很难停止执行
这是可选的,但最好添加适当的中断:
except KeyboardInterrupt:
exit()
你正在做的第二件事只是让你的生活变得更加艰难,那就是你不仅用简单的捕捉一切,除了;您没有打印相应的错误。加上这一点,你就能抓住这个案件的罪魁祸首,为你指明正确的方向,让你的生活变得更加轻松
except Exception as e:
print("Error: ", e)
print("Whoops, dicsonnected at %s. Retrying"
% datetime.datetime.now())
这将输出一条(相当恶心的)消息,该消息基本上打印出状态
对象,并以一行结束,通知您该对象:
is not JSON serializable
这有点合乎逻辑,因为我们这里处理的不是json
对象,而是从tweepy.Stream
返回的Status
对象
我不知道为什么tweepy
的创建者会这么做,我相信这背后有充分的理由,但要解决您的问题您只需访问底层的.json
对象:
json.dump(status._json, f)
现在,你应该可以走了
无法将“bytes”对象隐式转换为str
这似乎是一个内部的tweepy
问题,涉及从python2
到python3.x
的转换。具体而言,在文件streaming.py
中:
File "/home/jim/anaconda/envs/Python3/lib/python3.5/site-packages/tweepy/streaming.py", line 171, in read_line
self._buffer += self._stream.read(self._chunk_size) <--
TypeError: Can't convert 'bytes' object to str implicitly
文件“/home/jim/anaconda/envs/Python3/lib/Python3.5/site packages/tweepy/streaming.py”,第171行,在read\u行中
self.\u buffer+=self.\u stream.read(self.\u chunk\u size)您可以记录未编码文本的外观吗?可能是其中的某些内容使JSON格式无效。我将打印输出添加为pastebin链接-我以前没有在代码中添加任何日志记录,但我会在实现它后立即添加。添加了日志文件中的内容。这是我第一次使用si,我不确定这是正确的记录方式。如果您有任何指针,我在听:/此处有很多信息需要解析,但我马上会注意到,json.dump
会对单引号而不是双引号以及False
不在引号中抛出错误。有助于测试JSON数据的有效性。从流中出来的数据是有效的,肯定是JSON-在使用CLI之前,我将其转储到一个文件中;然后,我使用JSON模块(按行读取和JSON.loads(行))提取数据,可能是print()弄乱了它?因此我怀疑它与写模式有关。编辑:抓取打印()杂乱无章;因为通过'>'在CLI中转储会获取print()的输出,所以这是不可能的。感谢您提供的指针!我没有通过json.dump(status.\u json,f)
进行转储,但现在的错误是:错误:“str”不支持缓冲区接口
:/我确实找到了一个有用的指针。我想要丢弃的数据还不是100%,但它一般都会转储数据,所以我认为我的问题得到了解答。非常感谢。我正在调查这个错误,如果我发现一些有用的东西,我会相应地更新我的答案:-)我编辑了我的答案,以包括两个可能的替代解决方案。看看他们,如果你有精力,给他们一个机会。我知道解决方案一,实际上已经做到了;为我节省了大量恼人的编码错误。但是,唉,那就不可能了。关于解决方案2:Python 2是魔鬼。只是开玩笑。我将尝试一下,尽管我们试图不在2.7中编写代码,除非绝对没有其他方法。但我想我已经很接近这一点了。谢谢你的更新!