好吧,经过将近一个星期的研究,我将向大家介绍一下。我有一个看起来如下的文本文件(以3个单独的json对象为例,但其中有50K):
{
"zipcode":"00544",
"current":{"canwc":null,"cig":7000,"class":"observation"},
"triggers":[178,30,176,103,179,112,21,20,48,7,50,40,57]
}
{
"zipcode":"00601",
"current":{"canwc":null,"cig":null,"class":"observation"},
"triggers":[12,23,34,28,100]
}
{
"zipcode":"00602",
"current":{"canwc":null,"cig":null,"class":"observation"},
"triggers":[13,85,43,101,38,31]
}
我知道如何使用Python
json库处理JSON对象,但是我在如何通过读取文件创建5万个不同的json对象方面遇到了挑战。(也许我什至没有考虑正确,但最终我需要反序列化并加载到数据库中)我尝试过itertools认为自己需要一个生成器,因此可以使用:
with open(file) as f:
for line in itertools.islice(f, 0, 7): #since every 7 lines is a json object
jfile = json.load(line)
但是以上内容显然不起作用,因为它没有将7行作为单个json对象读取,而且我也不确定如何在整个文件上进行迭代并加载单个json对象。
以下将给我列出我可以切片的列表:
list(open(file))[:7]
任何帮助将非常感激。
非常接近我的需求,我认为实际上只有一步之遥,但仍然在迭代方面有点挣扎。最终,这将为我提供所有数据帧的迭代打印输出,但是我如何做到这一点,以便我可以捕获所有基本连接在一起的巨型数据帧?然后,我可以将最终的数据帧导出到csv等中。(还有比将它首先创建一个巨大的数据帧更好的方法将此结果上传到数据库中吗?)
def lines_per_n(f, n):
for line in f:
yield ''.join(chain([line], itertools.islice(f, n - 1)))
def flatten(jfile):
for k, v in jfile.items():
if isinstance(v, list):
jfile[k] = ','.join(v)
elif isinstance(v, dict):
for kk, vv in v.items():
jfile['%s' % (kk)] = vv
del jfile[k]
return jfile
with open('deadzips.json') as f:
for chunk in lines_per_n(f, 7):
try:
jfile = json.loads(chunk)
pd.DataFrame(flatten(jfile).items())
except ValueError, e:
pass
else:
pass