我正在使用Python 3.4,并且已经安装了NunPy / SciPy。 我需要阅读具有以下结构的文本文件:
*Node
1, -0.600000024, 1.20000005, 0.
2, -0.600000024, 0.300000012, 0.
3, -0.480560571, 0.1741862, 0.
4, -0.335430175, 0.0791868418, 0.
(...)
n, x, y, z
*Element
1, 1, 2, 3, 4
2, 5, 6, 7, 8
(...)
n, a, b, c, d
从这个txt文件我需要创建一个名为“node”的矩阵,它包含* Node和* Element之间的信息,我的意思是,它必须有4列和n行,例如:
node = array([1,-0.600000024,1.20000005,0。],[2,-0.600000024,0.300000012,0。],[3,-0.480560571,0.1741862,0。],[4,-0.335430175,0.0791868418 ,0。],[n,x,y,z])
另一个名为“element”的矩阵,其中包含* Element:
之后的行element = array([1,1,2,3,4],[2,5,6,7,8],[n,a,b,c,d])
实际上,我只需要“读取”文本文件并将此内容写入两个矩阵。但是,我必须从* Element下面的* Node下分析信息。我必须有两个矩阵,一个是节点,另一个是元素......但我是Python的新手,不知道如何以这种方式读取文本文件并生成那些矩阵......
我很感激任何帮助/例子。非常感谢!
答案 0 :(得分:2)
创建包含文件中行的列表,然后创建在index
处开始和停止的子列表,如果'*Node'
和'*Element'
适合您:
r=[]
s = open('File.txt')
For line in s:
r.append(line.strip('\n'))
Node=[]
Element=[]
For i in r[r.index('*Node')+1:r.index('*Element')]:
Node.append(map(float,i.split(',')))
For j in r[r.index('*Element')+1:]:
Element.append(map(int, j.split(','))
Node=np.array(Node)
Element=np.array(Element)
答案 1 :(得分:0)
@EoinS有一个很好的解决方案,我想提出一个替代方案,它在确定两个列表类型的开始和结束位置方面不那么动态,但会处理CSV格式的各种边缘情况并且具有列名称如下:
import numpy as np
node_rows = 75 #number of lines in the node section
interstitial_rows = 5 #number of lines between the last node record and the first element
element_rows = 1000 #the number of element rows
nodes = np.genfromtxt(
'sample.csv', # file name
skip_header=1, # lines to skip at the top, i assume there is a header
skip_footer=(interstitial_rows + 1 + element_rows), # lines to skip at the bottom, add one for the column name row at the end
delimiter=',', # column delimiter
names=['n', 'x', 'y', 'z'])
elements = np.genfromtxt(
'sample.csv', # file name
skip_header=(1 + node_rows + interstitial_rows), # lines to skip at the top, i assume there is a header
skip_footer=(1), # one for the column name row at the end
delimiter=',', # column delimiter
names=['n', 'a', 'b', 'c', 'd'])
请注意,我还没有测试过此代码,我一直使用类似的代码,但可能会出现语法错误或错过的内容。
找到有关如何阅读CSV的详情