You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用tweepy流式获取的Twitter JSON文件无法用json.loads()解析怎么办

问题原因

  • 核心报错原因是采集阶段的存储逻辑错误:tweepy的Stream.on_data方法传入的data参数本身是bytes类型的原始JSON字节流,你直接print(data)后将控制台输出重定向到文件时,Python会输出bytes对象的字面量表示,自动在JSON内容外包裹b'前缀和'后缀,最终存储的不是纯JSON字符串,而是Python bytes对象的格式化输出内容。JSON解析器读取到首字符为b而非{,就会触发JSONDecodeError: Expecting value: line 1 column 1 (char 0)报错。
  • 附带的采集代码bug:self.t_count += 0的逻辑永远不会让计数增长,永远不会触发5000条的停止条件。

解决方案

方案1:修改采集代码(推荐,后续采集的文件可直接解析)

把on_data方法内的输出逻辑改为先解码bytes为UTF-8字符串再输出,同时修复计数bug,修改后的代码如下:

import sys
from tweepy import Stream

class MyListener(Stream):
    t_count = 0

    def on_data(self, data):
        # 先解码bytes为UTF-8字符串再输出,避免生成b'前缀
        print(data.decode('utf-8'))
        self.t_count += 1 # 修复计数逻辑,每采集1条计数加1
        if self.t_count >= 5000:
            sys.exit("采集完成,正常退出")
        return True

    def on_error(self, status):
        print(status)

if __name__ == '__main__':
    # 替换为自己的开发者密钥即可
    consumer_key = "你的consumer_key"
    consumer_secret = "你的consumer_secret"
    access_token = "你的access_token"
    access_token_secret = "你的access_token_secret"
    stream = MyListener(consumer_key, consumer_secret, access_token, access_token_secret)
    stream.filter(track=['corona'], languages = ["en"])

后续新采集的文件直接使用你原来的读取代码即可正常解析。

方案2:修复现有已采集的旧文件

如果已经采集了大量数据不想重新采集,可以在读取阶段对每行内容做预处理,去掉外层的b'前缀和'后缀后再做JSON解析,代码如下:

import json

with open("covid-test-out", "r", encoding="utf-8") as f:
    count = 0
    for line in f:
        line = line.strip()
        # 跳过空行
        if not line:
            continue
        # 移除外层的b'前缀和'后缀
        json_str = line.lstrip("b'").rstrip("'")
        data = json.loads(json_str)
        # 后续数据处理逻辑
        count += 1

内容的提问来源于stack exchange,提问作者Tianhe Wang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 01:54:03