代码之家  ›  专栏  ›  技术社区  ›  Alice

ValueError:ast的节点或字符串格式错误。literal\u eval()

  •  0
  • Alice  · 技术社区  · 8 年前

    我只是想把一个二进制文件解析成Python。 以下是我的程序代码:

    try:
        with open('saves/temp/data.bin', 'r') as file:
            confirmed_data = json.load(file)
    except:
        pass
    
    confirmed_mode = confirmed_data[0]
    confirmed_location = confirmed_data[1]
    confirmed_units_data = confirmed_data[2]
    confirmed_units = ast.literal_eval(confirmed_units_data)
    confirmed_unit_quantities_data = confirmed_data[3]
    confirmed_unit_quantities = ast.literal_eval(confirmed_unit_quantities_data)
    

    我尝试了以下方法 data.bin 它工作得很好:

    ["PLANETARY", "Naboo", "{'Optimal': [], 'Default': ['B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids']}", "{'B1 Battle Droids': 100}"]
    

    然而,当我尝试下面的数据时,它不起作用,我也不知道为什么,因为它与我使用的上面的数据基本相同,而我使用的数据成功:

    ["PLANETARY", "Kamino", {"Optimal": ["Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids"], "Default": ["B1 Battle Droids", "B1 Battle Droids", "B1 Battle Droids", "B1 Battle Droids", "B1 Battle Droids", "B1 Battle Droids", "B1 Battle Droids", "B1 Battle Droids", "B1 Battle Droids", "B1 Battle Droids", "B1 Battle Droids", "B1 Battle Droids", "B1 Battle Droids", "B1 Battle Droids", "B1 Battle Droids", "B1 Battle Droids", "B1 Battle Droids", "B1 Battle Droids", "B1 Battle Droids", "B1 Battle Droids", "B1 Battle Droids", "B1 Battle Droids", "B1 Battle Droids", "B1 Battle Droids", "B1 Battle Droids", "B1 Battle Droids", "B1 Battle Droids", "B1 Battle Droids", "B1 Battle Droids", "B1 Battle Droids", "B1 Battle Droids", "B1 Battle Droids", "B1 Battle Droids", "B1 Battle Droids", "B1 Battle Droids", "B1 Battle Droids", "B1 Battle Droids", "B1 Battle Droids", "B1 Battle Droids", "B1 Battle Droids"]}, {"Aqua Droids": 60, "B1 Battle Droids": 40}]
    

    我查看了类似的SO问题,但没有找到任何可以解决我的问题的方法。我已经检查过了 数据箱子 有任何不是 Python文字 (即十进制数据类型或变量名),但未找到任何内容。我不太清楚为什么第一个有效,第二个无效。我使用的是Python 3.6。

    1 回复  |  直到 8 年前
        1
  •  0
  •   Alice    5 年前

    正如Daniel Pryden在评论中提到的,数据是不同的。第一个bin的某些部分引用为字符串,而第二个bin是标准JSON。

    我首先想出了一种方法来对这两个不同的文件进行分类。我发现完整的JSON是手动生成的默认值,而部分字符串是从配置文件生成的。

    因此,我在配置文件中添加了一个“config”标志,

    ["PLANETARY", "Naboo", "{'Optimal': [], 'Default': ['B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids', 'B1 Battle Droids']}", "{'B1 Battle Droids': 100}", "config"]
    

    以及默认文件的“手动”标志,

    ["PLANETARY", "Kamino", {"Optimal": ["Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids", "Aqua Droids"], "Default": ["B1 Battle Droids", "B1 Battle Droids", "B1 Battle Droids", "B1 Battle Droids", "B1 Battle Droids", "B1 Battle Droids", "B1 Battle Droids", "B1 Battle Droids", "B1 Battle Droids", "B1 Battle Droids", "B1 Battle Droids", "B1 Battle Droids", "B1 Battle Droids", "B1 Battle Droids", "B1 Battle Droids", "B1 Battle Droids", "B1 Battle Droids", "B1 Battle Droids", "B1 Battle Droids", "B1 Battle Droids", "B1 Battle Droids", "B1 Battle Droids", "B1 Battle Droids", "B1 Battle Droids", "B1 Battle Droids", "B1 Battle Droids", "B1 Battle Droids", "B1 Battle Droids", "B1 Battle Droids", "B1 Battle Droids", "B1 Battle Droids", "B1 Battle Droids", "B1 Battle Droids", "B1 Battle Droids", "B1 Battle Droids", "B1 Battle Droids", "B1 Battle Droids", "B1 Battle Droids", "B1 Battle Droids", "B1 Battle Droids"]}, {"Aqua Droids": 60, "B1 Battle Droids": 40}, "manual"]
    

    然后,我使用以下代码来识别配置文件,其中一个使用了该标志,并执行 ast.literal_eval 文件中的字符串部分。如果使用手动文件,则跳过该文件,并按原样使用标准JSON。

    import ast
    
    try:
        with open('saves/temp/data.bin', 'r') as file:
            confirmed_data = json.load(file)
    except:
        pass
    
    confirmed_mode = confirmed_data[0]
    confirmed_location = confirmed_data[1]
    
    if confirmed_data[4] == 'config':
        confirmed_units_data = confirmed_data[2]
        confirmed_units = ast.literal_eval(confirmed_units_data)
        confirmed_unit_quantities_data = confirmed_data[3]
        confirmed_unit_quantities = ast.literal_eval(confirmed_unit_quantities_data)
    else:
        confirmed_units = confirmed_data[2]
        confirmed_unit_quantities = confirmed_data[3]