如果我有时间调查,我可能会自己解决这个问题。我一直在尝试不同的东西,但我无法让它发挥作用!我正在营销中做我的主人,我们希望能够在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
我确实尝试将所有内容放在不同的行上,但问题是输出是垂直的而不是水平的每个事件。
答案 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()