从文本文件中读取元组列表作为元组,而不是字符串 - Python

7

我有一个文本文件,其中包含元组的行。每个元组/行都采用以下格式:('description string',[list of integers 1],[list of integers 2])。文本文件可能如下所示:

('item 1',[1,2,3,4],[4,3,2,1])
('item 2',[],[4,3,2,1])
('item 3',[1,2],[])

我想能够从文本文件中读取每一行,然后直接将它们放入一个函数中,其中

function(string, list1, list2)

我知道每一行都是作为字符串读入的,但我需要想办法提取这个字符串。我一直在尝试使用string.split(','),但遇到列表时会出现问题。有没有一种方法可以完成这个任务,或者我必须修改我的文本文件?
我还有一个元组列表的文本文件,我希望以类似的方式读入,它的格式如下:
[(1,2),(3,4),(5,6),...]
其中可能包含任意数量的元组。我想将其读入列表,并对列表中的每个元组进行循环。我认为这两个任务将使用大致相同的过程。
3个回答

20
你需要使用ast.literal_eval()函数。
>>> ast.literal_eval("('item 1', [1,2,3,4] , [4,3,2,1])")
('item 1', [1, 2, 3, 4], [4, 3, 2, 1])

我可能应该提到我正在运行Python 2.3,这是针对较新版本的吗?我找不到ast模块。 - Das.Rot
@Das.Rot:不幸的是,它确实是这样。 - Ignacio Vazquez-Abrams
@Das.Rot:看起来是2.6+版本。如果你确定内容,那么eval会起作用。 - sberry
哇,这对我来说解决了一个非常重要的问题。我正在使用ConfigParser。我将元组作为配置设置的参数之一写入文件。使用这个方法可以让我读取表示元组的字符串并将其转换回元组。这对于在配置文件中创建数据列表或元组非常有用。 - Demolishun

13

使用eval怎么样?

编辑 请查看@Ignacio的答案,使用ast.literal_eval

>>> c = eval("('item 1', [1,2,3,4] , [4,3,2,1])")
>>> c
('item 1', [1, 2, 3, 4], [4, 3, 2, 1])

我只会建议在您100%确定文件内容的情况下才这样做。

>>> def myFunc(myString, myList1, myList2):
...     print myString, myList1, myList2
... 
>>> myFunc(*eval("('item 1', [1,2,3,4] , [4,3,2,1])"))
item 1 [1, 2, 3, 4] [4, 3, 2, 1]

参考 @Ignacio 的答案...更加安全可靠。

使用 ast 可以实现:

>>> import ast
>>> def myFunc(myString, myList1, myList2):
...     print myString, myList1, myList2
... 
>>> myFunc(*ast.literal_eval("('item 1', [1,2,3,4] , [4,3,2,1])"))
item 1 [1, 2, 3, 4] [4, 3, 2, 1]

1

你可能还想看看pickle模块,它可以将Python对象保存到文本文件中,然后再读取回来。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接