如何从这个tweepy脚本中创建正确的JSON文件格式?

时间:2018-03-15 22:31:02

标签: python json twitter format tweepy

我正在尝试使用Tweepy获取搜索查询的JSON格式,但是有一个问题:我的最终JSON文件对于任何程序都是不可读的格式,在检查文件后,似乎脚本会写入所有数据没有任何正确的间距(对于JSON格式)

所以,我一直在努力寻找问题,但我真的找不到任何脚本。有没有人知道写作部分可能出现什么问题?

这是剧本:

def write_tweets(tweets, filename):
    ''' Function that appends tweets to a file. '''

    with open(filename, 'a') as f:
        for tweet in tweets:
            json.dump([tweet._json], f)
            f.write('\n')

。 。 。

for search_phrase in search_phrases:

    print('Search phrase =', search_phrase)

    ''' other variables '''
    name = search_phrase.split()[0]
    json_file_root = name + '/'  + name
    os.makedirs(os.path.dirname(json_file_root), exist_ok=True)
    read_IDs = False

    # open a file in which to store the tweets
    if max_days_old - min_days_old == 1:
        d = dt.datetime.now() - dt.timedelta(days=min_days_old)
        day = '{0}-{1:0>2}-{2:0>2}'.format(d.year, d.month, d.day)
    else:
        d1 = dt.datetime.now() - dt.timedelta(days=max_days_old-1)
        d2 = dt.datetime.now() - dt.timedelta(days=min_days_old)
        day = '{0}-{1:0>2}-{2:0>2}_to_{3}-{4:0>2}-{5:0>2}'.format(
              d1.year, d1.month, d1.day, d2.year, d2.month, d2.day)
    json_file = json_file_root + '_' + day + '.json'
    if os.path.isfile(json_file):
        print('Appending tweets to file named: ',json_file)
        read_IDs = True

    # authorize and load the twitter API
    api = load_api()

    # set the 'starting point' ID for tweet collection
    if read_IDs:
        # open the json file and get the latest tweet ID
        with open(json_file, 'r') as f:
            lines = f.readlines()
            max_id = json.loads(lines[-1])['id']
            print('Searching from the bottom ID in file')
    else:
        # get the ID of a tweet that is min_days_old
        if min_days_old == 0:
            max_id = -1
        else:
            max_id = get_tweet_id(api, days_ago=(min_days_old-1))
    # set the smallest ID to search for
    since_id = get_tweet_id(api, days_ago=(max_days_old-1))
    print('max id (starting point) =', max_id)
    print('since id (ending point) =', since_id)

Here's a image the JSON file that I can't open.

1 个答案:

答案 0 :(得分:0)

JSON text是一个JSON值。

您的代码正在打开一个文件并多次调用vcov(c(m, summary(m)$sigma)) ,连接一堆单独的JSON文本,并在它们之间添加换行符。结果不是JSON文本。正如json module的文档所说:

  

注意json.dumppickle不同,JSON不是框架协议,因此尝试使用相同的<重复调用marshal来序列化多个对象em> fp 将导致无效的JSON文件。

通常,你想要的是:

  • 将所有这些单独的内容放在列表中,并使用单个dump()编写该列表。生成的文件看起来与您正在编写的内容非常相似,除了围绕整个事物的括号和值之间的逗号,但它将是合法的JSON文本。
  • 将每件物品放在不同的档案中。每一个都是合法的JSON文本。

现在,有一些程序,API等使用“JSON文本流” * 作为格式,但没有真正的标准,并且每个人都有不同的规则如何组合它们 - 需要转义行终止符并使用json.dump分隔文本;要求仅转义\n并使用\r分隔文字;假设文本是自我划分的(框架);要使用其中一种格式,您必须确切知道它是什么;它不仅仅是“JSON” - 事实上,它根本不是JSON。

*或者更常见的是“JSON文档流”。旧标准将“文档”定义为对象或数组。新标准将“text”定义为任何JSON类型。这意味着文件是自我划分的,但文本不是。 (考虑\r\n\r\n后跟2。)