Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/312.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
Python 如何从这个tweepy脚本生成正确的JSON文件格式?_Python_Json_Twitter_Format_Tweepy - Fatal编程技术网

Python 如何从这个tweepy脚本生成正确的JSON文件格式?

Python 如何从这个tweepy脚本生成正确的JSON文件格式?,python,json,twitter,format,tweepy,Python,Json,Twitter,Format,Tweepy,我试图使用Tweepy获取搜索查询的JSON格式,但有一个问题:我的最终JSON文件对于任何程序都是不可读的格式,在检查文件后,脚本似乎写入了所有数据,但没有任何正确的间距(对于JSON格式) 所以,我一直在寻找问题,但我真的找不到任何与脚本。有人知道写作部分可能有什么问题吗 以下是脚本: def write_tweets(tweets, filename): ''' Function that appends tweets to a file. ''' with open(f

我试图使用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')
。 . .

A是一个单一的JSON值

您的代码正在打开一个文件并多次调用
json.dump
,将一组单独的json文本连接在一起,它们之间有新行。结果不是JSON文本。正如本文件所述:

注意
pickle
marshal
不同,JSON不是框架协议,因此尝试使用相同的fp重复调用
dump()
序列化多个对象将导致JSON文件无效

通常,您需要的是:

  • 将所有这些单独的内容放在一个列表中,并使用一个
    json.dump
    来编写该列表。生成的文件看起来与您正在编写的文件非常相似,除了整个文件周围的括号和值之间的逗号,但它将是一个合法的JSON文本
  • 把每件东西放在不同的文件里。每一个都是合法的JSON文本
现在,有一些程序、API等使用“JSON文本流”作为格式,但没有真正的标准,每个使用它的人都有不同的规则来组合它们,需要转义行终止符并使用
\n
来分隔文本;只需要转义
\r
,并使用
\r\n\r\n
分隔文本;假设文本是自定界的(框架);要使用其中一种格式,您必须确切地知道它是什么;它不仅仅是“JSON”——事实上,它根本不是JSON



*或者,更常见的是“JSON文档流”。旧标准将“文档”定义为对象或数组。新标准将“文本”定义为任何JSON类型。这意味着文档是自我界定的,而文本则不是。(考虑
2
后接
3

waaa代码太多。请打个电话,对不起!让我裁剪我需要检查的部分!是什么让您认为“脚本写入所有数据时没有任何正确的间距(对于Json格式)”?JSON的唯一标准是文件中的单个JSON文档。有一些程序和API使用多个JSON文档流,但它们都做不同的事情。有些要求JSON没有非转义行终止符,并且在每个终止符之后都有一个换行符。或者它们只禁止
\r
并要求
\r\n\r\n
作为分隔符。或者他们只是假设JSON是自定界的(如果您使用旧的“文档”定义,顶层必须是一个对象或一个数组)。诸如此类。那么,你想把它传递给哪个程序,它希望在一个文件中包含多个JSON文档,它在抱怨什么?这仍然是太多的代码,但现在它显然完全缺少所有相关的代码。当然,很难确切地知道什么是相关的,但您询问的是“编写部分”,在编辑的版本中没有
json.dump
或其他编写代码……请阅读@roganjosh链接的帮助;它解释了您应该和不应该包含的内容。此脚本仅用于更新一个文件中特定单词的推文数据库。。。有没有办法解析“json”以便将其作为数据库读取?@Santiagoguin打开它并以什么方式读取?如果您在我的答案中做了两件事中的任何一件,您可以在任何可以打开并读取任意JSON的程序中打开并读取它。使用它“作为一个数据库”对你来说太模糊了。要将此代码解析回一个Python对象还是一堆Python对象以再次编写Python查询?将其存储在特定的文档存储nosql数据库中并对其运行查询?将其存储在混合sql数据库中的JSON格式列中?只是在键值存储中将JSON字符串用作无意义的文本?
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)