我将我的列表保存在文本文件中,将其转换为字符串。 当我读到我的列表时,我得到一个这样的字符串:
"['layer1', '1', '10', '10', 'pending', 'Pending', '1', '1', '1', [[1, 10]]]"
我想知道是否有一种简单的方法可以将其转换回列表。 如果这是不可能的,如果有更好的方法来保存并取回它?
谢谢!
(我正在使用Python 2.6)
答案 0 :(得分:8)
肯定有更好的方法,最突出的是pickle
模块:
import cPickle as pickle
# Saving
with open("a.file", "w") as f:
pickle.dump([1, 2, "Hello!"], f)
# Reading
with open("a.file") as f:
obj = pickle.load(f)
与Python的json
模块相比,cPickle
更灵活。另一方面,JSON为您提供了一个人类可读的文件。如果能够序列化您的对象,请使用JSON,因为cPickle
不能用于不受信任的数据。
修改:删除了有关效果的评论,因为此事尚未确定。 This mini-benchmark by ms4py表明json
至少在某些对象上更快。
答案 1 :(得分:6)
查看ast.literal_eval
。它应该做你想要的。
>>> import ast
>>> sss="['layer1', '1', '10', '10', 'pending', 'Pending', '1', '1', '1', [[1, 10]]]"
>>> ast.literal_eval(sss)
['layer1', '1', '10', '10', 'pending', 'Pending', '1', '1', '1', [[1, 10]]]
这应该完全免受恶意代码的攻击(与eval
不同),但它能够读取的对象必须是简单对象(字符串,整数,浮点数,无和bool或列表/元组/字典完全由字符串,整数,浮点数,无和布尔组成。
当然,如果没有必要使用人类可读的数据文件,您应该按照其他答案的建议来查看pickle
或json
。
修改强>
我注意到json
对于人类来说非常容易阅读(参见下面的评论),所以你应该使用它。
答案 2 :(得分:4)
您可以使用json
:
In [1]: import json
In [2]: mylist = [1, 2, 3]
In [3]: with open('data', 'w') as fobj:
...: json.dump(mylist, fobj)
...:
In [4]: with open('data') as fobj:
...: l = json.load(fobj)
...:
In [5]: l
Out[5]: [1, 2, 3]