流媒体推文时Json.dump()无法正常工作

时间:2015-10-06 09:23:22

标签: json python-3.x tweepy

大家,大家早上好 我对我的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

文件被创建,状态肯定被读取(我的终端中有打印输出)但是在某个地方我的数据被炸成了必杀技,而不是我的文件 - 因为它在0字节处保持为空。

我发现了类似的案例here,然而在其他平台上,他们使用了json.dumps()而不是json.dump() - 尽管我也尝试过这两种功能(使用f.write(dumps(status))) ,但它们似乎都不起作用。

现在,我不是一个完全傻瓜;我很清楚它可能在我的最后 - 而不是JSON错误 - 但我无法弄清楚我做错了什么。

我唯一能做的就是把它归结为我open()语句中出现的错误,让我相信这是open()模式或者方式我将数据写入文件。我知道这一点,因为上面链接的问题的答案在我的机器上运行正常。

当然,我可以使用子进程模块并调用将print(status)转储到文件的管道,但这不能解决这个问题吗?

附录
根据要求,这是我的控制台output

Here's当我拨打logger.debug('status dump: %s', json.dumps(status))时记录器捕获的内容。

1 个答案:

答案 0 :(得分:1)

我必须做的初步观察(因为当我试图运行这个脚本时它感到沮丧):

不要使你的except子句过于宽泛,你会抓住所有内容(包括KeyboardInterrupt)并使其难以停止执行。

这是可选的,但添加适当的中断很好:

except KeyboardInterrupt:
    exit()

你正在做的第二件事就是让你的生活变得更加艰难,你不仅要使用裸except来抓住所有东西;您不是 打印相应的错误 。在这种情况下添加此功能将成为罪魁祸首,指出正确的方向,让您的生活更加轻松。

except Exception as e:
    print("Error: ", e)
    print("Whoops, dicsonnected at %s. Retrying"
            % datetime.datetime.now())

这会输出一个( 相当恶心的 )消息,该消息基本上打印出Status对象,并以一行通知您此对象:

is not JSON serializable

这有点合乎逻辑,因为我们在这里处理的不是json个对象,而是从Status返回的tweepy.Stream对象。

我不知道为什么tweepy的创作者确实做到了这一点,相信其背后有充分的理由,但 解决你的问题 您只需访问基础.json对象:

json.dump(status._json, f) 

现在,你应该好好去。

无法转换&#39;字节&#39;隐含地反对str

这似乎是与tweepyPython 2过渡相关的内部Python 3.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

第一个可能的解决方案:

用户 cozos tweepy GitHub存储库中提出了一个解决方案(根据回复,工作情况):

  

streaming.py

中      

我将行161更改为:

     
    

self._buffer += self._stream.read(read_len).decode('ascii')

  
     

和第171行:

     
    

self._buffer += self._stream.read(self._chunk_size).decode('ascii')

  
     

然后重新安装。

即使我不确定他的意思是重新安装&#39;。

第二个解决方案:

tweepyPython 2.7.10一起使用。它就像一个魅力。