2012-12-21 60 views
4

我想通过从文本文件中读取它来构建列表或列表的列表。如何通过从文件中读取来构建Python数据结构

例如,我有一个文件“mylist.txt”的说法

mylist = [ 
1, 
2, 
3, 
4] 

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

我想读的文本文件,然后用在我的Python脚本。

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

谢谢。

+0

文件是否有不可以人工编辑和/或人类可读? – Wessie

+0

是的。它需要是可编辑和可读的。 – michael

回答

2

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

例如

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

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

然后,在同一目录下另一个Python脚本,你可以做

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

这需要您进行任何解析代码,和Python的“数据”文件是很容易的手工编辑,太。

+0

在选项文件的情况下,这通常被证明是一个好方法。 – acjay

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

如果你有在[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] 
] 
1

由于您似乎暗示将列表存储为文件然后将其读回,草莓的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) 
+0

我的文件包含多个数据结构。那我怎么用'pickle'? – michael

+0

您可以创建多个泡菜,也可以将所有数据结构按照某种结构(如元组,列表,字典或对象)捆绑在一起,具体取决于您的应用程序的适合程度。 – acjay