【问题标题】:Reading comma separated tuples from a file in python从python中的文件中读取逗号分隔的元组
【发布时间】:2013-09-04 09:10:50
【问题描述】:

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

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

如何有效地做到这一点?问候。

【问题讨论】:

    标签: python file input


    【解决方案1】:

    由于它们看起来像正确的 python 元组,您可以使用 literal_eval。安全又快:

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

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

    【讨论】:

    • 看起来 OP 想要一个元组,而不是列表。您使用'[{0}]' 而不是'{0}''({0})' 有什么原因吗?
    • @SethMMorton 是的,没有仔细阅读问题:D '{0}' 不起作用,因为如果字符串是多行的。感谢您的关注。 :)
    【解决方案2】:

    假设有一个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 文字结构:字符串、数字、元组、列表、 字典、布尔值和无。

    希望对您有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多