将括号和逗号添加到多个JSON对象

时间:2013-08-13 13:40:49

标签: python json simplejson

我创建了一段非常简单的代码,用于在文本文件中以JSON格式读取推文,确定它们是否包含id和坐标,如果是,请将这些属性写入csv文件。这是代码:

f = csv.writer(open('GeotaggedTweets/ListOfTweets.csv', 'wb+'))
all_files = glob.glob('SampleTweets/*.txt')
for filename in all_files:
    with open(filename, 'r') as file:
        data = simplejson.load(file)
        if 'text' and 'coordinates' in data:
            f.writerow([data['id'], data['geo']['coordinates']])

我遇到了一些困难,但在优秀的JSON Lint网站的帮助下,我意识到了自己的错误。我有多个JSON对象,根据我的阅读,这些对象需要用逗号分隔,并在文件的开头和结尾添加方括号。

我怎样才能做到这一点?我在网上看到了一些例子,其中每一行都被读取,并且它被添加到第一行和最后一行,但是当我加载整个文件时,我不完全确定如何做到这一点。

1 个答案:

答案 0 :(得分:1)

你的文件包含太多换行符(在JSON值本身中)或者太少(在推文之间没有新行)。

您仍然可以使用一些创意重新拼接来修复此问题。以下生成器函数应该这样做:

import json

def read_objects(filename):
    decoder = json.JSONDecoder()

    with open(filename, 'r') as inputfile:
        line = next(inputfile).strip()
        while line:
            try:
                obj, index = decoder.raw_decode(line)
                yield obj
                line = line[index:]
            except ValueError:
                # Assume we didn't have a complete object yet
                line += next(inputfile).strip()
            if not line:
                line += next(inputfile).strip()

应能按顺序读取所有JSON对象:

for filename in all_files:
    for data in read_objects(filename):
        if 'text' and 'coordinates' in data:
            f.writerow([data['id'], data['geo']['coordinates']])

将多个JSON字符串写入一个文件是很好的,但是您需要确保条目以某种方式清楚地分开。例如,编写不使用换行符的JSON条目,然后在它们之间使用换行符,确保您可以稍后再一次读取它们并按顺序处理它们而不会有这么多麻烦。