簡體   English   中英

在 json 中將 float 字符串轉換為 float

[英]Convert float string to float in json

我有一個包含以下數據的 json( test.json ) 文件。 我有大約 10000 條記錄。 我需要將value從字符串轉換為浮點寫入新文件( test1.json )。 我怎樣才能從 Python 做到這一點?

{
    "name":"test001",
    "cat":"test",
    "loc":"x loc",
    "ings":[
        {
            "name":"rrrrrr",
            "value":"13.0"
        },
        {
            "name":"hhhh",
            "value":"18.0"
        }
    ],
    "nums":[
        {
            "name":"kkkk",
            "value":"82.05"
        },
        {
            "name":"uuuuu",
            "value":"53.55"
        }
    ]
},
{
    "name":"test002",
    "cat":"test1",
    "loc":"y loc",
    "ings":[
        {
            "name":"trtrtr",
            "value":"11.0"
        },
        {
            "name":"wewew",
            "value":"19.0"
        }
    ],
    "nums":[
        {
            "name":"iuyt",
            "value":"122.05"
        },
        {
            "name":"oiui",
            "value":"15.5"
        }
    ]
}

結果 json 文件(test1.json)應該如下所示......

{
    "name":"test001",
    "cat":"test",
    "loc":"x loc",
    "ings":[
        {
            "name":"rrrrrr",
            "value":13.0
        },
        {
            "name":"hhhh",
            "value":18.0
        }
    ],
    "nums":[
        {
            "name":"kkkk",
            "value":82.05
        },
        {
            "name":"uuuuu",
            "value":53.55
        }
    ]
},
{
    "name":"test002",
    "cat":"test1",
    "loc":"y loc",
    "ings":[
        {
            "name":"trtrtr",
            "value":11.0
        },
        {
            "name":"wewew",
            "value":19.0
        }
    ],
    "nums":[
        {
            "name":"iuyt",
            "value":122.05
        },
        {
            "name":"oiui",
            "value":15.5
        }
    ]
}

您可以為json.loads方法提供一個object_hook ,這將允許您修改在 json 中找到的任何對象(dicts):

import json

json_data = """
[{
    "name":"test001",
    "cat":"test",
    "loc":"x loc",
    "ings":[
        {
            "name":"rrrrrr",
            "value":"13.0"
        },
        {
            "name":"hhhh",
            "value":"18.0"
        }
    ],
    "nums":[
        {
            "name":"kkkk",
            "value":"82.05"
        },
        {
            "name":"uuuuu",
            "value":"53.55"
        }
    ]
},
{
    "name":"test002",
    "cat":"test1",
    "loc":"y loc",
    "ings":[
        {
            "name":"trtrtr",
            "value":"11.0"
        },
        {
            "name":"wewew",
            "value":"19.0"
        }
    ],
    "nums":[
        {
            "name":"iuyt",
            "value":"122.05"
        },
        {
            "name":"oiui",
            "value":"15.5"
        }
    ]
}]
"""

def as_float(obj):
    """Checks each dict passed to this function if it contains the key "value"
    Args:
        obj (dict): The object to decode

    Returns:
        dict: The new dictionary with changes if necessary
    """
    if "value" in obj:
        obj["value"] = float(obj["value"])
    return obj


if __name__ == '__main__':
    l = json.loads(json_data, object_hook=as_float)
    print (json.dumps(l, indent=4))

這會導致您想要的結果:

[
    {
        "loc": "x loc",
        "ings": [
            {
                "name": "rrrrrr",
                "value": 13.0
            },
            {
                "name": "hhhh",
                "value": 18.0
            }
        ],
        "name": "test001",
        "nums": [
            {
                "name": "kkkk",
                "value": 82.05
            },
            {
                "name": "uuuuu",
                "value": 53.55
            }
        ],
        "cat": "test"
    },
    {
        "loc": "y loc",
        "ings": [
            {
                "name": "trtrtr",
                "value": 11.0
            },
            {
                "name": "wewew",
                "value": 19.0
            }
        ],
        "name": "test002",
        "nums": [
            {
                "name": "iuyt",
                "value": 122.05
            },
            {
                "name": "oiui",
                "value": 15.5
            }
        ],
        "cat": "test1"
    }
]

要寫入文件:

with open("out.json", "w+") as out:
    json.dump(l, out, indent=4)

您需要遞歸遍歷數據並將任何看起來像浮點數的東西轉換為浮點數:

def fix_floats(data):
    if isinstance(data,list):
        iterator = enumerate(data)
    elif isinstance(data,dict):
        iterator = data.items()
    else:
        raise TypeError("can only traverse list or dict")

    for i,value in iterator:
        if isinstance(value,(list,dict)):
            fix_floats(value)
        elif isinstance(value,str):
            try:
                data[i] = float(value)
            except ValueError:
                pass

它應該可以解決問題:

my_data = [
        {   "name" : "rrrrrr", 
            "value" : "13.0"  }, 
        {   "name" : "hhhh", 
            "value" : "18.0"  }, 
        ]

fix_floats(my_data)

>>> my_data
[{'name': 'rrrrrr', 'value': 13.0}, {'name': 'hhhh', 'value': 18.0}]

如果您有一個或特定的鍵值 object,您可以重復包含字母字符串或數字字符串的值,然后是 map 並使用string.isnumeric()檢查它們的類型:

dict = { 'a':'100', 'b':'200', 'c':'300', 'd':'four_hundred', 'e':'500' }
dict_parse = {k: int(v) if v.isnumeric() else v for k, v in dict.items()}

>>> dict_parse
{ 'a': 100, 'b': 200, 'c': 300, 'd':'four_hundred', 'e':500}

處理float時修改 if 語句以替換小數點,您可以將相同的原則應用於負數

dict = { 'a':'10.0', 'b':'20.12', 'c':'300.3', 'd':'four_hundred', 'e':'500' }
dict_parse = {k: float(v) if v.replace(".", "").isnumeric() else v for k, v in dict.items()}

>>> dict_parse
{ 'a': 10.0, 'b': 20.12, 'c': 300.3, 'd':'four_hundred', 'e':500}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM