如何在Python中高效读取包含复杂多行数据的文本文件?

问题描述 投票:0回答:1

在寻找合适的解决方案时,我遇到了各种方法,例如 numpy.loadtxtnumpy.genfromtxt 乍一看似乎很有希望,但并不能直接起作用。

挑战

我的数据集的一行是多行,请参阅前两行:

[array([[ 1,  0,  0,  0,  0],
       [ 0,  1,  0,  0,  0],
       [ 0,  0,  1,  0,  0],
       [ 1,  0, -1,  0,  0],
       [ 0,  0,  0,  1,  0],
       [ 0,  0,  0,  0,  1],
       [-2, -1,  0, -1, -1],
       [-2, -2,  0, -1,  0]]), 24, 4, 0, 232, 988, 1464, 10, 8, 246, 12]
[array([[ 1,  0,  0,  0,  0],
       [-1,  0,  0,  0,  0],
       [ 0,  1,  0,  0,  0],
       [ 0,  0,  1,  0,  0],
       [ 0,  0,  0,  1,  0],
       [-1, -1,  0,  1,  0],
       [ 0,  0,  0,  0,  1],
       [ 0, -2, -2, -2, -1]]), 28, 4, 0, 244, 1036, 1536, 10, 8, 260, 13]
...

CAS(计算机代数系统)生成此输出,我对输出格式的影响有限。

文件不是很小,它可以增长(收集更多数据后)高达 3 GB。

到目前为止我尝试过的

尝试使用

np.genfromtxt('polytopes_5d_reflexive.txt')
读取数据无法无缝工作。经典的逐行读取也没有优势,因为描述一个数据行的行数各不相同。

背景

俗话说“数学数据不贵”。在我们的例子中,我们实际上自己生成这样的数据,即五维多胞体,以便检查它们的属性,例如顶点数、体积等。

我不想要求现成的解决方案,但我非常感谢在正确方向上引发思考的冲动。

python numpy parsing multiline multilinestring
1个回答
0
投票

一种可能的解决方案是使用

re
/
ast.literal_eval
来解析文件。但是,是的,更正确的解决方案是使用正确的序列化格式(例如 Json...):

import re
from ast import literal_eval

import numpy as np

txt = """\
[array([[ 1,  0,  0,  0,  0],
       [ 0,  1,  0,  0,  0],
       [ 0,  0,  1,  0,  0],
       [ 1,  0, -1,  0,  0],
       [ 0,  0,  0,  1,  0],
       [ 0,  0,  0,  0,  1],
       [-2, -1,  0, -1, -1],
       [-2, -2,  0, -1,  0]]), 24, 4, 0, 232, 988, 1464, 10, 8, 246, 12]
[array([[ 1,  0,  0,  0,  0],
       [-1,  0,  0,  0,  0],
       [ 0,  1,  0,  0,  0],
       [ 0,  0,  1,  0,  0],
       [ 0,  0,  0,  1,  0],
       [-1, -1,  0,  1,  0],
       [ 0,  0,  0,  0,  1],
       [ 0, -2, -2, -2, -1]]), 28, 4, 0, 244, 1036, 1536, 10, 8, 260, 13]"""


for line in re.findall(r"^\[.*?\]$", txt, flags=re.S | re.M):
    arr, *rest = literal_eval(line.replace("array", ""))
    print(np.array(arr))
    print(rest)
    print()

打印:

[[ 1  0  0  0  0]
 [ 0  1  0  0  0]
 [ 0  0  1  0  0]
 [ 1  0 -1  0  0]
 [ 0  0  0  1  0]
 [ 0  0  0  0  1]
 [-2 -1  0 -1 -1]
 [-2 -2  0 -1  0]]
[24, 4, 0, 232, 988, 1464, 10, 8, 246, 12]

[[ 1  0  0  0  0]
 [-1  0  0  0  0]
 [ 0  1  0  0  0]
 [ 0  0  1  0  0]
 [ 0  0  0  1  0]
 [-1 -1  0  1  0]
 [ 0  0  0  0  1]
 [ 0 -2 -2 -2 -1]]
[28, 4, 0, 244, 1036, 1536, 10, 8, 260, 13]
© www.soinside.com 2019 - 2024. All rights reserved.