[英]ValueError: malformed node or string with ast.literal_eval()
I'm simply trying to parse a binary file into Python.我只是想将二进制文件解析为 Python。 Here is the code for my program:
这是我的程序的代码:
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)
I tried the following as data.bin
and it worked perfectly:我尝试了以下作为
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}"]
However, when I tried the data below it didn't work and I have no idea why since it is basically identical to the data that I used above, which worked successfully:但是,当我尝试下面的数据时,它不起作用,我不知道为什么,因为它与我上面使用的数据基本相同,并且成功运行:
["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}]
I've looked at similar SO questions and found nothing to fix my problem.我看过类似的 SO 问题,但没有发现可以解决我的问题。 I've checked if
data.bin
has anything that is not a Python literal (ie Decimal datatype or variable name) but found nothing.我已经检查过
data.bin
是否有任何不是Python 文字的东西(即十进制数据类型或变量名称),但什么也没找到。 I'm not exactly sure why the first works and the second doesn't.我不确定为什么第一个有效而第二个无效。 I'm using Python 3.6.
我正在使用 Python 3.6。
As mentioned by Daniel Pryden in the comments, the data is different.正如 Daniel Pryden 在评论中提到的,数据是不同的。 Some parts of the first bin are quoted as strings, whereas the second bin is standard JSON.
第一个 bin 的某些部分被引用为字符串,而第二个 bin 是标准 JSON。
I first figured out a way to classify the two different files.我首先想出了一种对两个不同文件进行分类的方法。 I found that the fully JSON one was the default generated manually, and that the partially string one was generated from a config file.
我发现完全 JSON 是手动生成的默认值,部分字符串是从配置文件生成的。
Therefore, I added a 'config' flag to the config file,因此,我在配置文件中添加了一个“配置”标志,
["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"]
And a 'manual' flag to the default file,以及默认文件的“手动”标志,
["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"]
I then used the following code to identify the config file one using the flag, and perform ast.literal_eval
on the parts of the file that are strings.然后我使用以下代码来识别使用标志的配置文件,并对文件的字符串部分执行
ast.literal_eval
。 If the manual file is used, this is skipped and the standard JSON is used as-is.如果使用手册文件,则跳过此文件并按原样使用标准 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]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.