0

我将我的列表保存在一个文本文件中,并将其转换为一个字符串。当我阅读我的列表时,我得到一个这样的字符串:

"['layer1', '1', '10', '10', 'pending', 'Pending', '1', '1', '1', [[1, 10]]]"

我想知道是否有一种简单的方法可以将其转换回列表。如果不可能,是否有更好的方法来保存并取回它?

谢谢!

(我正在使用 Python 2.6)

4

3 回答 3

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 能够序列化您的对象,请选择 JSON,因为cPickle它不能用于不受​​信任的数据。

编辑:删除了关于性能的评论,因为这件事有些悬而未决。 ms4py 的这个迷你基准表明json至少在某些对象上更快。

于 2012-07-17T13:25:11.010 回答
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),但它能够读取的对象必须是简单的对象(字符串、整数、浮点数、无和布尔值或完全由字符串、整数、浮点数组成的列表/元组/字典, 无和布尔值)。

当然,如果不需要人类可读的数据文件,您应该查看picklejson按照其他答案的建议。

编辑

我注意到它对json人类来说很容易阅读(见下面的评论),所以你可能应该使用它。

于 2012-07-17T13:24:28.123 回答
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]
于 2012-07-17T13:26:46.030 回答