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

7 投票
3 回答
13182 浏览
提问于 2025-04-16 10:48

我有一个文本文件,里面有很多行,每行都是一个元组。每个元组的格式是这样的:('描述字符串', [整数列表1], [整数列表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)

我知道每一行读取进来的是一个字符串,但我需要以某种方式提取出这个字符串。我尝试使用字符串的split(',')方法,但在处理列表时遇到了问题。有没有什么办法可以做到这一点,还是我需要以某种方式修改我的文本文件?

我还有一个文本文件,里面是一个元组的列表,格式是这样的:

[(1,2),(3,4),(5,6),...]

这个文件可能包含任意数量的元组。我想把它读成一个列表,然后对列表中的每个元组进行循环。我觉得这两者的处理方式大致相同。

3 个回答

1

你可能还想看看 pickle 这个模块,它可以把Python对象保存到文本文件里,然后再把它们读回来。

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])
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])

我只建议在你对文件内容百分之百确定的情况下使用这个。

>>> 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]

撰写回答