从带有 namedtuple 条目的文本文件中读取
Reading from text-file with namedtuple entries
我有问题。我有一个由命名元组组成的列表。我把这个列表写到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),...]
如果我使用 split-method,它几乎是我想要的,但正如字符串所期望的那样:
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,...),...],...]']
非常感谢你们!
虽然我很讨厌推广 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)]
NB 如果您读取的数据之前不是由 您自己[=20] 生成和保存的,则您不应在任何情况下使用 eval
=].
您必须将文件解析为文本,并使用文本处理技术提取信息。
您可以在此处使用 regular expression:
import re
hello_pattern = re.compile(r'Hello\(i=(\d+), time=(\d+), x=(\d+), y=(\d+)\)')
此模式与您的 namedtuple 值的表示相匹配,并允许您访问每个值的数字,尽管是字符串形式:
>>> 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)]
所以完整的解决方案是:
import re
from collections import namedtuple
Hello = namedtuple('Hello', 'i time x y') # or import your own ready definition
hello_pattern = re.compile(r'Hello\(i=(\d+), time=(\d+), x=(\d+), y=(\d+)\)')
data = []
with open('file.txt') as inputfile:
for line in inputfile:
recovered = [
Hello(*map(int, match))
for match in hello_pattern.findall(line)
]
data.append(recovered)
我有问题。我有一个由命名元组组成的列表。我把这个列表写到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),...]
如果我使用 split-method,它几乎是我想要的,但正如字符串所期望的那样:
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,...),...],...]']
非常感谢你们!
虽然我很讨厌推广 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)]
NB 如果您读取的数据之前不是由 您自己[=20] 生成和保存的,则您不应在任何情况下使用 eval
=].
您必须将文件解析为文本,并使用文本处理技术提取信息。
您可以在此处使用 regular expression:
import re
hello_pattern = re.compile(r'Hello\(i=(\d+), time=(\d+), x=(\d+), y=(\d+)\)')
此模式与您的 namedtuple 值的表示相匹配,并允许您访问每个值的数字,尽管是字符串形式:
>>> 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)]
所以完整的解决方案是:
import re
from collections import namedtuple
Hello = namedtuple('Hello', 'i time x y') # or import your own ready definition
hello_pattern = re.compile(r'Hello\(i=(\d+), time=(\d+), x=(\d+), y=(\d+)\)')
data = []
with open('file.txt') as inputfile:
for line in inputfile:
recovered = [
Hello(*map(int, match))
for match in hello_pattern.findall(line)
]
data.append(recovered)