我想通过从文本文件中读取列表或列表来构建列表。
例如,我有一个文件'mylist.txt'说
mylist = [
1,
2,
3,
4]
myotherlist = [
[1, 3, 4, 5],
[3, 5, 3, 6]
]
我想阅读该文本文件,然后在我的python脚本中使用它。
这可能吗? 我只是在python语法中使用上面的例子。 我的目标是避免自己编写解析逻辑。而XML似乎对我的目的来说太复杂了。
谢谢。
答案 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
,但exec
和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]
]
答案 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)