从python中的文件中读取逗号分隔的元组

时间:2013-08-31 22:03:49

标签: python file input

我正在尝试从带有逗号分隔的多个元组的文件中读取。示例输入文件如下所示:

  

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

从这个文件中读取后,我需要一个像这样的元组:

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

如何有效地完成这项工作?问候。

2 个答案:

答案 0 :(得分:12)

因为它们看起来像正确的python元组,所以你可以使用literal_eval。它安全快捷:

  

安全地评估表达式节点或包含Python的字符串   表达。提供的字符串或节点可能仅包含以下内容   Python文字结构:字符串,数字,元组,列表,dicts,布尔值,   没有。

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

答案 1 :(得分: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)]

仅供参考,literal_eval()是安全的:

  

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

希望有所帮助。

相关问题