使用try和except解析JSON

时间:2016-05-22 12:07:57

标签: python json parsing try-catch

如果我有时间调查,我可能会自己解决这个问题。我一直在尝试不同的东西,但我无法让它发挥作用!我正在营销中做我的主人,我们希望能够在Python中编码非常基本上将数据集(json)解析为可用于进一步分析的有组织的文本文件。

我们有一个包含大量缺失值的数据集。我想要解析的是:艺术家,mbid(音乐脑子艺术家id),活动数据,地点名称,城市。

这是我为此编写的脚本(部分):

for event in setlists:
    eventdate = event.get(u'@eventDate')
    venuename = event.get(u'venue').get(u'@name')
    mbid = event.get(u'artist').get(u'@mbid')
    artistname = event.get(u'artist').get(u'@name')
    city = event.get(u'venue').get(u'city').get(u'@name')

    f = open(parse_file, 'a')
    f.write(artistname+'\t'+mbid+'\t'+eventdate+'\t'+venuename+'\t'+city+'\n')
    f.close()

此脚本的工作方式类似于一个魅力,除了它会遗漏缺少值的条目,例如:没有城市。

我希望它无论如何都要将它报告给一行文字,然后打印"丢失"对于缺少的信息。

我无法上班,我也不知道从哪里开始。我尝试过这样的事情:

f = open(parse_file, 'a')
try: f.write(artistname) except: continue try: f.write(mbid) except:     continue...
f.close()

解析文件中的每一行都应如下所示:

artistname mbid eventdate venuename location

我确实尝试将所有内容放在不同的行上,但问题是输出是垂直的而不是水平的每个事件。

2 个答案:

答案 0 :(得分:1)

所以这绝对不是正确这样做的方式,但是因为你很匆忙......

for event in setlists:
    eventdate = event.get(u'@eventDate', 'missing')
    venuename = event.get(u'venue', {u'@name': 'missing'}).get(u'@name', 'missing')
    mbid = event.get(u'artist', {u'@mbid': 'missing'}).get(u'@mbid', 'missing')
    artistname = event.get(u'artist', {u'@name': 'missing'}).get(u'@name', 'missing')
    city = event.get(u'venue').get(u'city', {u'@name': 'missing'}).get(u'@name', 'missing')

<etc>

这个想法是为.get提供默认参数,这样你的嵌套.get方法就可以了.get:P

答案 1 :(得分:0)

尝试 - 除了第一个块,你在示例city = event.get(u'venue').get(u'city').get(u'@name')中获取数据 - 得到失败,因此处理也是如此。

更新:

根据提供的数据 - 这是有效的。请注意,提供的数据不是JSON文件。它是一组行,其中每一行都是JSON文件...这就是为什么我做了readlines,然后处理它们中的每一个。它可以以更加pythonic的方式完成,更高效的内存,但我想展示如何解决问题。希望它有所帮助:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import json
from StringIO import StringIO

with open('sample.json.txt') as data_file:
    content = data_file.readlines()

f = open('out_ok.txt', 'a')
errors  = open('out_errors.txt', 'a')

try: 
    for ctx in content:
        line = StringIO(ctx)
        try:
            json_data = json.load(line)
        except UnicodeDecodeError:
            errors.write('unicode: ' + ctx)
            continue
        event = json_data.get('setlists').get('setlist')
        try:
            eventdate = event.get(u'@eventDate')
            venuename = event.get(u'venue').get(u'@name')
            mbid = event.get(u'artist').get(u'@mbid')
            artistname = event.get(u'artist').get(u'@name')
            city = event.get(u'venue').get(u'city').get(u'@name')
            f.write(artistname+'\t'+mbid+'\t'+eventdate+'\t'+venuename+'\t'+city+'\n')
        except AttributeError:
            errors.write('json: ' + json.dumps(event))
finally:
    f.close()
    errors.close()