Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/315.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 向多个JSON对象添加括号和逗号_Python_Json_Simplejson - Fatal编程技术网

Python 向多个JSON对象添加括号和逗号

Python 向多个JSON对象添加括号和逗号,python,json,simplejson,Python,Json,Simplejson,我创建了一段非常简单的代码,可以读取文本文件中JSON格式的tweet,确定它们是否包含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:

我创建了一段非常简单的代码,可以读取文本文件中JSON格式的tweet,确定它们是否包含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对象,从我读到的内容来看,这些对象需要用逗号分隔,并在文件的开头和结尾添加方括号


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

您的文件要么包含太多的换行符(JSON值本身),要么包含太少的换行符(tweet之间根本没有换行符)

您仍然可以通过使用一些创造性的重新缝合来修复此问题。以下发电机功能应能实现此功能:

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

如果JSON字符串以每行一个条目的形式保存到文件中,则无需这样做。请参阅下面的链接,该链接给出了一个“无法解码JSON对象”错误,我说“如果”。你最初是怎么创建这个文件的?对不起!我使用Flume下载了推文,并将其导入Hadoop。然后,我使用Hadoop的“copyToLocal”方法将它们输出到文本文件中。如果我把每一条tweet放到JSON Lint中,它们都是完美的。当他们在一起的时候,他们是有问题的。谢谢你为帮助我付出的努力。不过,我现在确实有一个不同的错误。当使用这个时,我得到:TypeError:“NoneType”对象没有属性“getitem”,我不知道它是否有区别,但我知道一个事实,不是所有我解析的tweet都有我要查找的地理和坐标字段。只有一些例外。@AndrewMartin:假设您得到的异常是针对
f.writerow([])
行的。如果它在另一条线上,一定要让我知道。我试过“如果数据['geo']不是空的话:”但这不起作用(它忽略了def有坐标的一些tweet)。if data.data('geo')导致:AttributeError:'dict'对象没有属性'data'@AndrewMartin:这是完全正确的,因为我在那里打错了,对不起!我想建议您在data.get('geo')不是None时使用