如何通过从文件中读取python数据结构来构建python数据结构

时间:2012-12-21 23:41:28

标签: python serialization

我想通过从文本文件中读取列表或列表来构建列表。

例如,我有一个文件'mylist.txt'说

mylist = [
1,
2,
3,
4]

myotherlist = [
 [1, 3, 4, 5],
 [3, 5, 3, 6]
]

我想阅读该文本文件,然后在我的python脚本中使用它。

这可能吗? 我只是在python语法中使用上面的例子。 我的目标是避免自己编写解析逻辑。而XML似乎对我的目的来说太复杂了。

谢谢。

4 个答案:

答案 0 :(得分:4)

如果我有以下数据文件(data.txt): -

[1,2,3,4]

然后这段代码会把它读成一个列表。

from ast import literal_eval

with open('data.txt') as fsock:
   mylist = literal_eval( fsock.read() )

这也适用于其他数据类型,例如字典。有关详细信息,请参阅literal_eval文档。

答案 1 :(得分:2)

如果它是列表列表,那么您应该在mylists.txt文件中“直接”定义它。

e.g。

MYLISTS = [
    [1, 2, 3],
    [2, 3, 4],
    ...
]

将mylists.txt重命名为mylists.py。

然后,在同一目录中使用另一个Python脚本,您可以执行

import mylists
for sublist in mylists.MYLIST:
    for elem in sublist:
        ....

这不需要你的解析代码,Python“数据”文件也很容易手工编辑。

答案 2 :(得分:1)

如果你有[1, 2, 3, 4]形式的内容,在这种情况下你可以使用ast

In [1]: import ast

In [2]: with open('lists.txt', 'rb') as f:
   ...:     lists = f.readlines()
   ...:     
   ...:     

In [3]: list_container = [ast.literal_eval(line.strip()) for line in lists]

In [4]: list_container
Out[4]: [[1, 2, 3], [[1, 2, 3], [4, 5, 6]]]

在这种情况下,lists.txt看起来像这样:

[1, 2, 3]
[[1, 2, 3], [4, 5, 6]]

但是,如果您的文件与上述内容完全相同,则可以使用exec,但execeval之类的内容应始终谨慎使用:

In [2]: with open('test.txt', 'rb') as f:
   ...:     contents = f.read()
   ...:     
   ...:     

In [3]: exec(contents)

In [4]: mylist
Out[4]: [1, 2, 3, 4]

In [5]: myotherlist
Out[5]: [[1, 3, 4, 5], [3, 5, 3, 6]]

In [6]: print contents
mylist = [
1,
2,
3,
4]

myotherlist = [
 [1, 3, 4, 5],
 [3, 5, 3, 6]
]

答案 3 :(得分:1)

由于您似乎暗示将列表作为文本存储到文件然后将其读回,因此Strawberry的ast示例可能是最佳的。但是如果你不熟悉它,我也会抛弃pickle方法,这是一个二进制序列化。它将产生更小的文件和更快的读/写时间,代价是人类可读性和Python之外的可移植性。

写:

import pickle # or cPickle

myList = [1, 2, 3, 4]

with open('data.txt', 'w') as f:
    pickle.dump(myList, f)

阅读:

import pickle

with open('data.txt', 'w') as f:
    myList = pickle.load(f)