使用Python分析多行JSON文件时出现问题

2024-04-28 11:54:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图使用Python 2.7中的json库解析JSON多行文件。下面给出了一个简化的示例文件:

{
"observations": {
    "notice": [
        {
            "copyright": "Copyright Commonwealth of Australia 2015, Bureau of Meteorology. For more information see: http://www.bom.gov.au/other/copyright.shtml http://www.bom.gov.au/other/disclaimer.shtml",
            "copyright_url": "http://www.bom.gov.au/other/copyright.shtml",
            "disclaimer_url": "http://www.bom.gov.au/other/disclaimer.shtml",
            "feedback_url": "http://www.bom.gov.au/other/feedback"
        }
    ]
}
}

我的代码如下:

import json

with open('test.json', 'r') as jsonFile:
    for jf in jsonFile:
        jf = jf.replace('\n', '')
        jf = jf.strip()
        weatherData = json.loads(jf)
        print weatherData

但是,我得到一个错误,如下所示:

Traceback (most recent call last):
File "test.py", line 8, in <module>
weatherData = json.loads(jf)
File "/home/usr/anaconda2/lib/python2.7/json/__init__.py", line 339, in loads
return _default_decoder.decode(s)
File "/home/usr/anaconda2/lib/python2.7/json/decoder.py", line 364, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "/home/usr/anaconda2/lib/python2.7/json/decoder.py", line 380, in raw_decode
obj, end = self.scan_once(s, idx)
ValueError: Expecting object: line 1 column 1 (char 0)

为了进行一些测试,我修改了代码,以便在删除换行符并去掉前导和尾随空格之后,将内容写入另一个文件(扩展名为json)。令人惊讶的是,当我读回后一个文件时,我没有得到任何错误,并且解析成功。修改后的代码如下:

import json

filewrite = open('out.json', 'w+')

with open('test.json', 'r') as jsonFile:
    for jf in jsonFile:
        jf = jf.replace('\n', '')
        jf = jf.strip()
        filewrite.write(jf)

filewrite.close()

with open('out.json', 'r') as newJsonFile:
    for line in newJsonFile:
        weatherData = json.loads(line)
        print weatherData

输出如下:

{u'observations': {u'notice': [{u'copyright_url': u'http://www.bom.gov.au/other/copyright.shtml', u'disclaimer_url': u'http://www.bom.gov.au/other/disclaimer.shtml', u'copyright': u'Copyright Commonwealth of Australia 2015, Bureau of Meteorology. For more information see: http://www.bom.gov.au/other/copyright.shtml http://www.bom.gov.au/other/disclaimer.shtml', u'feedback_url': u'http://www.bom.gov.au/other/feedback'}]}}

知道在使用json库之前删除新行和空白会发生什么吗?


Tags: injsonhttpurlwwwlinebomdisclaimer
3条回答

仅供参考,您可以在单个with语句中打开这两个文件:

with open('file_A') as in_, open('file_B', 'w+') as out_:
    # logic here
    ...

如果您试图逐行解析json文件,您将变得疯狂。json模块有帮助器方法来直接读取文件对象或字符串,即loadloads方法。load接受包含json数据的文件的文件对象(如下所示),而loads接受包含json数据的字符串。

选项1:首选

import json
with open('test.json', 'r') as jf:
    weatherData = json.load(jf)
    print weatherData

选择2:

import json
with open('test.json', 'r') as jf:
    weatherData = json.loads(jf.read())
    print weatherData

如果您正在寻找更高性能的json解析,请签出ujson

在第一个片段中,您尝试逐行解析它。你应该立刻把它全部解析掉。最简单的方法是使用json.load(jsonfile)。(jf变量名是一个字符串,因此具有误导性)。所以正确的分析方法是:

import json

with open('test.json', 'r') as jsonFile:
    weatherData = json.loads(jsonFile)

尽管将json存储在一行中是个好主意,因为它更简洁。

在第二个片段中,您的问题是将其打印为unicode字符串,而u'string here'是特定于python的。有效的json使用双引号

相关问题 更多 >