4

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

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

mylist = [
1,
2,
3,
4]

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

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

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

谢谢你。

4

4 回答 4

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文档。

于 2012-12-21T23:52:44.210 回答
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“数据”文件也很容易手动编辑。

于 2012-12-21T23:56:51.687 回答
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,尽管应该始终谨慎使用类似execand之类的东西:eval

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]
]
于 2012-12-21T23:55:29.083 回答
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)
于 2012-12-22T00:00:23.257 回答