2013-08-31 257 views
4

我想从文件中读取几个以逗号分隔的元组。样品输入文件看起来像:从Python中的文件中读取逗号分隔的元组

(0,0),(0,2),(0,4),( - 1,-1),(0,-2),(1, - (-1,3),(1,1),(1,3),(1,5),(2,1),(-1,-3),

0),(2,2),(3,3),

(2,4),(3,5),(4,4),(5,3),(6,4),( 5,5),(7,5)

读取此文件后,我需要这样的元组:

G = ((0, 0), (0, 2), (0, 4), (-1, -1), (0, -2), (1, -1), (-1, -3), \ 
(-1, 1), (-1, 3), (1, 1), (1, 3), (1, 5), (2, 0), (2, 2), (3, 3), \ 
(2, 4), (3, 5), (4, 4), (5, 3), (6, 4), (5, 5), (7, 5)) 

这可以如何有效地完成?问候。

回答

12

由于它们看起来像适当的python元组,所以可以使用literal_eval。它的安全性如下:

安全地评估表达式节点或包含Python 表达式的字符串。提供的字符串或节点可能只包含以下Python文字结构:字符串,数字,元组,列表,字典,布尔值, 和None。

import ast 
s = '''(0, 0), (0, 2), ...''' 
result = ast.literal_eval('({0})'.format(s)) 
+0

它看起来像OP想要一个元组,而不是列表。是否有理由使用“{[0}]”而不是“{0}”或“({0})”? – SethMMorton

+0

@SethMMorton是的,没有仔细阅读问题:D''{0}''不起作用,因为如果字符串是多行。感谢您的注意。 :) –

6

假设有一个file.txt具有以下内容:

(0, 0), (0, 2), (0, 4), (-1, -1), (0, -2), (1, -1), (-1, -3) 
(-1, 1), (-1, 3), (1, 1), (1, 3), (1, 5), (2, 0), (2, 2), (3, 3), 
(2, 4), (3, 5), (4, 4), (5, 3), (6, 4), (5, 5), (7, 5) 

可以在一个循环每行使用literal_eval()和扩展得到的列表:

from ast import literal_eval 

result = [] 
with open('file.txt', 'r') as f: 
    for line in f: 
     result.extend(literal_eval(line.strip())) 

print result 

打印:

[(0, 0), (0, 2), (0, 4), (-1, -1), (0, -2), (1, -1), (-1, -3), (-1, 1), (-1, 3), (1, 1), (1, 3), (1, 5), (2, 0), (2, 2), (3, 3), (2, 4), (3, 5), (4, 4), (5, 3), (6, 4), (5, 5), (7, 5)] 

FYI,literal_eval()是安全的:

安全评估的表达式节点或含有一个Python 表达的字符串。提供的字符串或节点可能只包含以下Python文字结构中的 :字符串,数字,元组,列表, 字典,布尔值和无。

希望有所帮助。

相关问题