gpt4 book ai didi

Python:尝试反序列化文件中的多个 JSON 对象,每个对象跨越多个但间隔一致的行数

转载 作者:IT老高 更新时间:2023-10-28 12:54:46 26 4
gpt4 key购买 nike

好的,经过近一周的研究,我打算试一试。我有一个如下所示的文本文件(以 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 对象,但我在如何通过读取文件创建 50,000 个不同的 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

最佳答案

加载 6 个额外的行,并将 string 传递给 json.loads():

with open(file) as f:
for line in f:
# slice the next 6 lines from the iterable, as a list.
lines = [line] + list(itertools.islice(f, 6))
jfile = json.loads(''.join(lines))

# do something with jfile

json.load() 不仅会读取文件中的下一个对象,而且 islice(f, 0, 7) 只会读取前 7 个对象行,而不是按 7 行 block 读取文件。

您可以在生成器中以大小为 N 的 block 的形式读取文件:

from itertools import islice, chain

def lines_per_n(f, n):
for line in f:
yield ''.join(chain([line], itertools.islice(f, n - 1)))

然后用它来分 block 你的输入文件:

with open(file) as f:
for chunk in lines_per_n(f, 7):
jfile = json.loads(chunk)

# do something with jfile

或者,如果你的 block 是可变长度的,请阅读直到你有可以解析的东西:

with open(file) as f:
for line in f:
while True:
try:
jfile = json.loads(line)
break
except ValueError:
# Not yet a complete JSON value
line += next(f)

# do something with jfile

关于Python:尝试反序列化文件中的多个 JSON 对象,每个对象跨越多个但间隔一致的行数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20400818/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com