当前位置: 首页 > 面试题库 >

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

闻人举
2023-03-14
问题内容

好吧,经过将近一个星期的研究,我将向大家介绍一下。我有一个看起来如下的文本文件(以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

问题答案:

而是再加载6行,然后将 字符串 传递给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行块读取文件。

您可以在生成器中以大小N的块包装读取文件:

from itertools import islice, chain

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

然后使用它来分块您的输入文件:

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

        # do something with jfile

另外,如果您的块结果是可变长度的,请阅读直到有可以解析的内容:

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


 类似资料:
  • 我尝试反序列化json: 我有两个实体: 和 如何使用一个json条目同时反序列化两个实体?以下是使用Jackson ObjectMapper的main摘录: 它解析日期、uuid和数据集,但不能解析具有hmm_subfamily、hmm_evalue和hmm_score值的HmmResult对象:我得到错误:p.getHmmResult():null。(HmmResult hm=ObjMappe

  • 问题内容: 你好亲爱的同事们, 我有一个Garden类,在其中我可以序列化和反序列化多个Plant类对象。如果想将其分配给mein静态方法中的调用变量,则可以进行序列化,但是不能进行反序列化。 反序列化代码: 我的调用代码: 编辑 我有一个空的Pointer异常 @NilsH的解决方案工作正常,谢谢! 问题答案: 如何序列化整个列表呢?无需序列化列表中的每个对象。 如果那不能解决您的问题,请发布有

  • 序列化对象时,我设置, 将对象附加到序列化文件。例如,我将电子邮件对象序列化到同一个文件中。 当反序列化这些保存的对象时,我想得到所有对象,但它只给出第一个对象。 我发现了一个类似的问题,反序列化java中的许多对象?但是没有,方法。那么,反序列化时如何获取所有对象?

  • 问题内容: 我正在尝试反序列化(使用gson)如下所示的JSON对象: 我该如何处理?我什至不知道该怎么称呼- 这里代表了多个“项目”,但这不是一个数组。当我尝试将其反序列化为数组时,程序在“预期的Begin_Array但找到Begin_Object”异常时崩溃。当我尝试将其反序列化为Strong对象时(请参见下面的类),程序将运行,但所有字段均返回null。 这是我尝试将其映射到的类: 完整的J

  • 问题内容: 我正在解析包含json对象的文件。问题是某些文件在一行中有多个对象。例如: 我做了一个函数,尝试在没有左括号的情况下解析子字符串,但是值中可能有大括号。我尝试过通过检查引号的开头和结尾来跳过值,但是也有带有转义引号的值。有关如何处理此问题的任何想法? 我的尝试: 问题答案: 简单但不够健壮的版本: 如果包含在字符串中,则将失败 正如其他建议一样,您然后可以尝试解析每个元素。如果无效,则

  • 问题内容: 我可能会尝试以困难的方式执行此操作,所以请让我知道是否有更好的解决方案。 我正在用Java开发一个简单的文字游戏,您可以通过GUI选择动作。我有几个班级正在尝试序列化一个是播放器,另一个是NPC。是否有一种简单的方法可以将一个以上的对象(播放器和NPC)序列化到同一文件中?我可以序列化一个对象并将其加载回游戏中。 我会以错误的方式处理吗?有没有更简单的方法来尝试保存游戏状态? 如果我有