Python 如何从这个tweepy脚本生成正确的JSON文件格式?
我试图使用Tweepy获取搜索查询的JSON格式,但有一个问题:我的最终JSON文件对于任何程序都是不可读的格式,在检查文件后,脚本似乎写入了所有数据,但没有任何正确的间距(对于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
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文本json.dump
- 把每件东西放在不同的文件里。每一个都是合法的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)