在Python中将字符串转换为列表而不使用Eval?

在Python中将字符串转换为列表而不使用Eval?,python,string,list,eval,Python,String,List,Eval,我有一个字符串,类似这样:“[[['Cheese',72],'Milk',45],'Bread',22]]” 我想把它转换成一个列表。我知道我可以使用eval(string)来获取列表,但是eval让我感到害怕,因为它可能导致灾难(并且因为我可以获取一个非列表作为有效输出)。是否有其他更明智/更安全的方法将此字符串转换为列表?我知道这是一个列表,任何不是列表的都是无效数据(应该检查和/或抛出错误)。如果您坚持这样做,可以使用ast.literal\u eval函数 >>> im

我有一个字符串,类似这样:
“[[['Cheese',72],'Milk',45],'Bread',22]]”


我想把它转换成一个列表。我知道我可以使用eval(string)来获取列表,但是eval让我感到害怕,因为它可能导致灾难(并且因为我可以获取一个非列表作为有效输出)。是否有其他更明智/更安全的方法将此字符串转换为列表?我知道这是一个列表,任何不是列表的都是无效数据(应该检查和/或抛出错误)。

如果您坚持这样做,可以使用ast.literal\u eval函数

>>> import ast
>>> foo = "[['Cheese', 72], ['Milk', 45], ['Bread', 22]]"
>>> ast.literal_eval(foo)
[['Cheese', 72], ['Milk', 45], ['Bread', 22]]
我相信其他人会告诉你,你可能做错了什么,或者使用JSON之类的库来传输像这样的任意数据结构,我也不会不同意


您可以考虑使用<代码> JSON<代码>模块进行反序列化并确保字符串处于。

有关使用此模块的详细信息,请参阅。

这里有一种方法: exec(“list=“+foo”) 这将使一个变量'list'与字符串中的列表转换为实际列表。
这也适用于字符串中的字典、数组、bool等。

您需要查看此模块:作为一点背景:我继承了一个Django应用程序,以前的开发人员将数据库表中的项目列表存储为字符串。不一定要这样做,我也不反对使用数据迁移来转换为JSON,但如果有“秘密握手”来解析列表,我没问题。我不是Python专家。这真的比使用
eval
好吗?它还可以被利用吗?为了防止有人得到ValueError,请记住首先将foo更改为string,然后应用ast.literal\u eval(foo)
import json
s = "[['Cheese', 72], ['Milk', 45], ['Bread', 22]]"
s = s.replace("'", '"')
print json.loads(s)