Python 3.x使用标头读取文件(标识的标头之间的数据)

时间:2016-05-29 02:36:05

标签: python numpy matrix text abaqus

我正在使用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的新手,不知道如何以这种方式读取文本文件并生成那些矩阵......

我很感激任何帮助/例子。非常感谢!

2 个答案:

答案 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'])

请注意,我还没有测试过此代码,我一直使用类似的代码,但可能会出现语法错误或错过的内容。

您可以通过numpy herehere

找到有关如何阅读CSV的详情