使用namedtuple条目从文本文件读取

时间:2018-10-23 15:33:19

标签: python namedtuple

我有问题。我有一个包含命名元组的列表。我将此列表写到了file.txt。现在我想把它读回来。我在这里发现建议使用json事先进行转换,而不是保存。但是我需要一个针对已经保存的文件的解决方案。我的文本文件如下:

file.txt:

[Hello(i=0, time=0, x=0, y=0), Hello(i=0, time=0, x=0, y=0),...]
[Hello(i=1, time=0, x=0, y=0), Hello(i=0, time=0, x=0, y=0),...]
[Hello(i=2, time=0, x=0, y=0), Hello(i=0, time=0, x=0, y=0),...]
[Hello(i=3, time=0, x=0, y=0), Hello(i=0, time=0, x=0, y=0),...]

如果我使用拆分方法,则几乎是我想要的,但可以预期是字符串:

lines = input_data.split('\n')
lines
['[Hello(i=0, time=0, x=0, y=0), Hello(i=0, time=0, x=0, y=0),...]','[Hello(i=1,...),...],...]']

非常感谢你们!

2 个答案:

答案 0 :(得分:4)

您必须将文件解析为文本,然后使用文本处理技术提取信息。

您可以在此处使用Collections

public Polinom(int[] entries)
{
    this.koeficienti = new ArrayList<Integer>(entries.length);
    for (int entry : entries) {
        this.koeficienti.add(entry);
    }
}

此模式与namedtuple值的表示形式匹配,并允许您访问每个值的数字,尽管它们是字符串:

import re

hello_pattern = re.compile(r'Hello\(i=(\d+), time=(\d+), x=(\d+), y=(\d+)\)')

然后可以将这些字符串再次转换为整数并重新创建实例;对于单行,列表理解为:

>>> line = '[Hello(i=0, time=0, x=0, y=0), Hello(i=0, time=0, x=0, y=0),...]'
>>> hello_pattern.findall(sample)
[('0', '0', '0', '0'), ('0', '0', '0', '0')]

及其演示在同一行:

[Hello(*map(int, match)) for match in hello_pattern.findall(line)]

因此,完整的解决方案是:

>>> from collections import namedtuple
>>> Hello = namedtuple('Hello', 'i time x y')
>>> [Hello(*map(int, match)) for match in hello_pattern.findall(sample)]
[Hello(i=0, time=0, x=0, y=0), Hello(i=0, time=0, x=0, y=0)]

答案 1 :(得分:1)

尽管我讨厌推广eval(),但这肯定是在任何其他解决方案都更糟的罕见情况中的一种。

line = "[Hello(i=3, time=0, x=0, y=0), Hello(i=0, time=0, x=0, y=0)]"
# Original definition, I assume
Hello = namedtuple('Hello', ['i','time','x','y'])
data = eval(line)
#[Hello(i=3, time=0, x=0, y=0), Hello(i=0, time=0, x=0, y=0)]

注意事项:在任何情况下,您都不应该使用eval来读取数据,而不是由您自己产生并保存的。