我自愿帮助某人将有限元网格从一种格式转换为另一种格式(i-deas * .unv到艾伯塔)。我用NumPy做了一些额外的网格修改,但我在将原始文本文件数据读入NumPy数组时遇到了问题。我已经尝试genfromtxt和loadtxt到目前为止没有成功。用NumPy读取大格式的文本文件
一些细节:
1)所有组由页眉和页脚标志在自己的行分隔符“-1”。
2)NODE组在它自己的行上有一个标题“2411”。我只想读这组中的交替行,用4个整数跳过每行,但是用3个Fortran双精度数读取行。
3)ELEMENT连接组在它自己的行上有一个标题“2412”。所有数据都是整数,只有前4列需要读取。由于缺少2个和3个节点元素的值,NumPy数组中会有一些空插槽。
4)“2477”节点组我认为我可以使用正则表达式来处理自己,该正则表达式可以找到要读取的行。 5)真正的数据文件将有大约100万行文本,所以我非常希望它在可能的情况下被矢量化(或者任何NumPy可以快速读取内容)。
对不起,如果我提供了太多的信息,谢谢。
以下各行是* .unv文本文件格式的部分示例。
-1
2411
146303 1 1 11
6.9849462399269246D-001 8.0008842847097805D-002 6.6360238055630028D-001
146304 1 1 11
4.1854795755893875D-001 9.1256034628308313D-001 3.5725496189239300D-002
146305 1 1 11
7.5541258490349616D-001 3.7870257739063029D-001 2.0504544370783115D-001
146306 1 1 11
2.7637569971086767D-001 9.2829777518336010D-001 1.3757239038663285D-001
-1
-1
2412
9 21 1 0 7 2
0 0 0
1 9
10 21 1 0 7 2
0 0 0
9 10
1550 91 6 0 7 3
761 3685 2027
1551 91 6 0 7 3
761 2380 2067
39720 111 1 0 7 4
71854 59536 40323 73014
39721 111 1 0 7 4
45520 48908 133818 145014
-1
-1
2477
1 0 0 0 0 0 0 3022
PERMANENT GROUP1
7 2 0 0 7 3 0 0
7 8 0 0 7 7 0 0
7 147 0 0 7 148 0 0
2 0 0 0 0 0 0 2915
PERMANENT GROUP2
7 1 0 0 7 5 0 0
7 4 0 0 7 6 0 0
7 9 0 0 7 11 0 0
-1
谢谢你的建议。看一下“fromfile”命令,它看起来像从第一行读取文件,因此不会允许只读取特定块。我看着使用“open”命令为上面的“fp”定义了一个块,但是这似乎也只是从第一行读取文件。 – Tim 2013-02-19 12:00:28
我在上面添加了一个简化的例子。 – 2013-02-19 12:13:54
感谢您的拼写!我遗漏的一点是,readline()命令的作用是告诉fromfile命令它应该从当前行读取fp,而不是文件的开头。有没有办法将起始行设置为某个值,而无需多次调用readline()?我可以通过在一行的开始处搜索字符串“-1”来快速找到数据块开始和结束处的行号,但必须在循环中调用readline()才能达到所需的起始点有点缓慢的事情。谢谢! – Tim 2013-02-19 13:09:05