0

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

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

4

1 回答 1

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

于 2013-08-13T14:01:07.587 回答