【问题标题】:Adding brackets and commas to multiple JSON objects向多个 JSON 对象添加括号和逗号
【发布时间】:2013-08-13 13:40:49
【问题描述】:

我创建了一段非常简单的代码来读取文本文件中 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 对象,从我读到的内容中,这些对象需要用逗号分隔,并在文件的开头和结尾添加方括号。

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

【问题讨论】:

  • 如果您的 JSON 字符串作为一个条目保存到文件中每行,则不需要这样做。见Loading & Parsing JSON file in python
  • 点击该链接会给我一个“无法解码 JSON 对象”错误
  • 我说的是“如果”。您最初是如何创建文件的?
  • 对不起!我使用 Flume 下载了推文,并将它们通过管道传输到 Hadoop。然后我使用 Hadoop 的“copyToLocal”方法将它们输出到文本文件中。如果我将每条推文放入 JSON Lint 中,它们都是完美的。当他们在一起时,他们就有问题了。

标签: python json simplejson


【解决方案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 条目,然后在它们之间使用换行符,以确保您以后可以一个接一个地读取它们并按顺序处理它们,而不会那么麻烦。

【讨论】:

  • 感谢您为帮助我所做的努力。不过,我现在确实有一个不同的错误。当使用这个我得到: TypeError: 'NoneType' object has no attribute 'getitem'
  • 我不知道这是否会有所不同,但我知道并非所有我正在解析的推文都有我正在寻找的地理和坐标字段。只有其中一些人这样做。
  • @AndrewMartin:假设您得到的异常是f.writerow([]) 行。如果它在另一条线上,请告诉我。
  • 我试过“如果数据['geo'] 不是无:”但效果不佳(它忽略了一些 def 有坐标的推文)。 if data.data('geo') 导致:AttributeError: 'dict' object has no attribute 'data'
  • @AndrewMartin:完全正确,因为我在那里打错字了,对不起!我想建议你改用if data.get('geo') is not None:
猜你喜欢
  • 2017-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-13
  • 2019-01-26
  • 1970-01-01
  • 1970-01-01
  • 2019-05-10
相关资源
最近更新 更多