【发布时间】:2015-10-06 09:23:21
【问题描述】:
大家早上好,
我对我的 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 错误 - 但我无法弄清楚我做错了什么。
我唯一能做的就是将其归结为在我的 with open() 语句中出现的错误,这让我相信这与 open() 模式或我写入数据的方式有关到文件。我知道这一点,因为上面链接的问题的答案在我的机器上运行良好。
当然,我可以使用 subprocess 模块并调用将打印(状态)转储到文件的管道,但这不能解决这个问题吗?
附录
根据要求,这是我的控制台output。
Here's 当我调用logger.debug('status dump: %s', json.dumps(status)) 时,记录器捕获了什么。
【问题讨论】:
-
你能记录下未编码的文本是什么样子的吗?其中的某些内容可能会使 JSON 格式无效。
-
我将我的打印输出添加为 pastebin 链接 - 我之前没有在我的代码中添加任何日志记录,但我会尽快实现它。
-
添加了我的日志文件所说的内容。我第一次使用这个 si,我不确定这是记录它的正确方法。如果您有任何指示,我正在听:/
-
这里有很多信息需要解析,但我马上注意到
json.dump会抛出单引号而不是双引号和False不在引号中的错误。 This site 有助于测试 JSON 数据的有效性。 -
从流中出来的有效数据肯定是 JSON - 我在使用 CLI 之前将其转储到文件中;然后我使用 JSON 模块提取数据(按行和 json.loads(line) 读取),可能只是 print() 搞砸了?因此我怀疑它与写入模式有关。 edit:把 print() 乱七八糟的刮一下;因为通过 '>' 在 CLI 中转储需要 print() 的输出,所以不可能。
标签: json python-3.x tweepy