【问题标题】:Create a nested JSON file from a list of lines that contains the key and value mappings从包含键和值映射的行列表创建嵌套 JSON 文件
【发布时间】:2021-11-01 00:09:49
【问题描述】:

复杂的标题,让我解释一下:)

我有一个充满循环数据的数组,格式如下:

id: 0 --------------------------------------------------------------------------------
Roma
Via Francesco Saverio Altamura
Via: 0
https://www.immobiliare.it/annunci/p-147276/
tipologia: Appartamento
m2: 113 m²
piano: 1°, con ascensore
p_edificio: 4 piani
prezzo: € 158.000 - € 270.000
balcone: 0
cantina: 0
terrazza: 0
giardino privato: 0
taverna: 0
esposizione esterna: 0
id: 1 --------------------------------------------------------------------------------
Roma
Monti
Via degli Zingari
https://www.immobiliare.it/annunci/89886713/
tipologia: Appartamento
m2: 113 m²
piano: 1°, con ascensore
p_edificio: 4 piani
prezzo: € 790.000
balcone: 0
cantina: 0
terrazza: 0
giardino privato: 0
taverna: 0
esposizione esterna: 0

我添加了一条线,使其在容易结束的地方可见。请注意,它不会是实际输入行的一部分。

我想做的是创建一个 JSON 文件,而不是简单地将这个数组转储到文件中,我想创建一个像以下示例的良好结构:

{
"id": "123"
    "city": "Roma",
    "zone": "Via Francesco Saverio Altamura",
    "via": "0",
    "link": "https://www.immobiliare.it/annunci/p-147276/",
    "prezzo": "€ 158.000 - € 270.000"
    "addons": [
        {
            "balcone": "0",
            "terrazza": "0",
             and so on...
        },
    ]
}

直到现在我都不需要组织它,但是现在在实现了一个好的数组之后,循环数据吐出 16 个元组,每个 id 都有“key”:“value”,我需要组织它并且可以'不知道该怎么做,我需要它。

欢迎任何有关学习和理解此过程的帮助!

【问题讨论】:

  • ---------- 真的出现在输入文件中吗?或者您只是为了可见性而将它们添加到此处?
  • @NielGodfreyPonciano 我添加它们是为了可见性,我以为我写了,也许我忘记了,但是,主要是为了让你们很容易区分一个 id 的开始和结束:)
  • @JonSG 数据应该是周期性的,但实际上我只是重新阅读了我的代码并且我傻了,所以两者都没有。基本上它收集所有数据并制作列表。有时,我从中收集数据的广告会错过我正在搜索的内容之一,在这种情况下,它会在列表中丢失,我可以实施一个解决方案,但可能不需要它/希望如此:)
  • @matszwecja 字典是正确的术语,对不起!
  • @MichelangeloAmorusoManzari 是否可以以类似字典的格式组织您的文本文件?如果是,那么将其转换为 json 文件会更容易

标签: python arrays json python-3.x list


【解决方案1】:

来自内置json 模块的json.dumps 处理得非常好,您只需首先将您的对象转换为表示该结构的字典。

【讨论】:

  • 好的,所以你认为我应该从我之前创建的列表中创建一个字典?是否有首选方法或简单直接的解决方案?顺便说一句谢谢! :)
  • 字典列表可以正常工作。
  • 好的,谢谢!如果我设法做到这一点,我很乐意将其作为正确的答案:)
  • 您提到您希望 id 成为主要标识符,但在提供的示例中,它实际上与“zone”等其他属性没有任何不同。如果您传递一个字典列表,您将获得类似于您为每个条目提供的内容。如果您传递一个字典,其中键为 id 而值是表示单个条目的字典,则 id 将是您想要的主要标识符
【解决方案2】:

假设输入数据在字段上具有固定顺序,这是使用正则表达式的解决方案。

import re

data = """
id: 0
Roma
Via Francesco Saverio Altamura
Via: 0
https://www.immobiliare.it/annunci/p-147276/
tipologia: Appartamento
m2: 113 m²
piano: 1°, con ascensore
p_edificio: 4 piani
prezzo: € 158.000 - € 270.000
balcone: 0
cantina: 0
terrazza: 0
giardino privato: 0
taverna: 0
esposizione esterna: 0
id: 1
Roma
Monti
Via degli Zingari
https://www.immobiliare.it/annunci/89886713/
tipologia: Appartamento
m2: 113 m²
piano: 1°, con ascensore
p_edificio: 4 piani
prezzo: € 790.000
balcone: 0
cantina: 0
terrazza: 0
giardino privato: 0
taverna: 0
esposizione esterna: 0
"""

data_fixed_keys = [
    "id",
    "city",
    "zone",
    "via",
    "link",
    "tipologia",
    "m2",
    "piano",
    "p_edificio",
    "prezzo",
    "balcone",
    "cantina",
    "terrazza",
    "giardino privato",
    "taverna",
    "esposizione esterna",
]

matches = re.findall(
    r"id: (?P<id>.*)\s+"
    "(?P<city>.*)\s+"
    "(?P<zone>.*)\s+"
    "(?P<via>.*)\s+"
    "(?P<link>.*)\s+"
    "tipologia: (?P<tipologia>.*)\s+"
    "m2: (?P<m2>.*)\s+"
    "piano: (?P<piano>.*)\s+"
    "p_edificio: (?P<p_edificio>.*)\s+"
    "prezzo: (?P<prezzo>.*)\s+"
    "balcone: (?P<balcone>.*)\s+"
    "cantina: (?P<cantina>.*)\s+"
    "terrazza: (?P<terrazza>.*)\s+"
    "giardino privato: (?P<giardino_privato>.*)\s+"
    "taverna: (?P<taverna>.*)\s+"
    "esposizione esterna: (?P<esposizione_esterna>.*)",
    data,
)

""" Option 1: Dictionary JSON """
data_json = {}
for match in matches:
    current_dict = dict(zip(data_fixed_keys[1:5], match[1:5]))
    current_dict["addons"] = dict(zip(data_fixed_keys[5:], match[5:]))
    current_dict["prezzo"] = current_dict["addons"].pop("prezzo")
    data_json[match[0]] = current_dict

""" Option 2: List JSON
data_json = []
for match in matches:
    current_dict = dict(zip(data_fixed_keys[:5], match[:5]))
    current_dict["addons"] = dict(zip(data_fixed_keys[5:], match[5:]))
    current_dict["prezzo"] = current_dict["addons"].pop("prezzo")
    data_json.append(current_dict)
"""

print(data_json)

输出(漂亮的打印)

# If using Option 1 (Dictionary JSON)
{
    "0": {
        "city": "Roma",
        "zone": "Via Francesco Saverio Altamura",
        "via": "Via: 0",
        "link": "https://www.immobiliare.it/annunci/p-147276/",
        "addons": {
            "tipologia": "Appartamento",
            "m2": "113 m\u00b2",
            "piano": "1\u00b0, con ascensore",
            "p_edificio": "4 piani",
            "balcone": "0",
            "cantina": "0",
            "terrazza": "0",
            "giardino privato": "0",
            "taverna": "0",
            "esposizione esterna": "0"
        },
        "prezzo": "\u20ac 158.000 - \u20ac 270.000"
    },
    "1": {
        "city": "Roma",
        "zone": "Monti",
        "via": "Via degli Zingari",
        "link": "https://www.immobiliare.it/annunci/89886713/",
        "addons": {
            "tipologia": "Appartamento",
            "m2": "113 m\u00b2",
            "piano": "1\u00b0, con ascensore",
            "p_edificio": "4 piani",
            "balcone": "0",
            "cantina": "0",
            "terrazza": "0",
            "giardino privato": "0",
            "taverna": "0",
            "esposizione esterna": "0"
        },
        "prezzo": "\u20ac 790.000"
    }
}

# If using Option 2 (List JSON)
[
    {
        "id": "0",
        "city": "Roma",
        "zone": "Via Francesco Saverio Altamura",
        "via": "Via: 0",
        "link": "https://www.immobiliare.it/annunci/p-147276/",
        "addons": {
            "tipologia": "Appartamento",
            "m2": "113 m\u00b2",
            "piano": "1\u00b0, con ascensore",
            "p_edificio": "4 piani",
            "balcone": "0",
            "cantina": "0",
            "terrazza": "0",
            "giardino privato": "0",
            "taverna": "0",
            "esposizione esterna": "0"
        },
        "prezzo": "\u20ac 158.000 - \u20ac 270.000"
    },
    {
        "id": "1",
        "city": "Roma",
        "zone": "Monti",
        "via": "Via degli Zingari",
        "link": "https://www.immobiliare.it/annunci/89886713/",
        "addons": {
            "tipologia": "Appartamento",
            "m2": "113 m\u00b2",
            "piano": "1\u00b0, con ascensore",
            "p_edificio": "4 piani",
            "balcone": "0",
            "cantina": "0",
            "terrazza": "0",
            "giardino privato": "0",
            "taverna": "0",
            "esposizione esterna": "0"
        },
        "prezzo": "\u20ac 790.000"
    }
]

【讨论】:

  • 您好,如果我制作了一本字典并拥有包含所有信息的列表怎么办?有没有一种好方法可以将列表转储到字典中,将值放置在相对于正确键的正确位置?
  • 你能举个例子吗?由于输入文本包含多于 1 条记录(由字段id 标记),那么在这里您可以看到结果已经是一个字典列表,其中每个字典对应 1 个 id。键的顺序也与原始文本相同(prezzo 除外,因为它与其他 addons 混合在一起)。
  • 或者你的意思是说应该是[{"id":"0", "city": "Roma"}, {"id":"1", "city": "Paris"}]而不是{"0": {"city": "Roma"}, "1": {"city": "Paris"}}
  • @MichelangeloAmorusoManzari 如果它更符合您的需要,您能否查看我更新的答案?我将输出更改为以id 为键的字典。
  • 嗨 Niel,我检查了它,但它不适用于我的情况,无论如何谢谢,抱歉没有回答,真的想找到一个好的解决方案!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-27
  • 1970-01-01
  • 2021-06-18
  • 1970-01-01
  • 1970-01-01
  • 2018-11-02
  • 1970-01-01
相关资源
最近更新 更多