Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
流式发送推文时Json.dump()不工作_Json_Python 3.x_Tweepy - Fatal编程技术网

流式发送推文时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中编写代码,除非绝对没有其他方法。但我想我已经很接近这一点了。谢谢你的更新!