0

我有以下代码:

    inputFile = open('C:/Abaqus_JOBS' + JobDir + '/' + JobName + '-3_4.inp', 'r')
    for line in inputFile:
        fileData.append([x.strip() for x in line.split(',')])

    fel=0
    for row,data in enumerate(fileData):
        if data[0]=='*Node':
            row_nodes = row #number of the row when data='*Node'
         if data[0]=='*Element' and fel==0:
            row_elements2 = row
            fel=1

    for row,data in enumerate(fileData[row_nodes + 1:row_elements2]):
        nodes.append(data) #data between '*Nodes' and '*Element'

但是,它在外部程序的 python 解释器中运行非常慢(几分钟)(我必须在这里运行脚本,因为我需要访问该程序生成的结果数据库)。我该如何优化它?

编辑:我inputFile在代码末尾关闭:inputFile.close()

4

2 回答 2

3

如果我理解得很好,您首先逐行存储文件,然后搜索“*Element”的第一次出现和“*Node”的最后一次出现,最后存储它们之间的内容。

我看到的一个优化是您可以从 3 次解析文件变为一次:

inputFile = open('C:/Abaqus_JOBS' + JobDir + '/' + JobName + '-3_4.inp', 'r')

go_storage = False
nodes = None

for line in inputFile:
    if line[0] == "*Node":
        # Reset what has already been memorized
        nodes = list()
        go_storage = True
    elif line[0] == "*Element":
        break
    elif go_storage:
        nodes.append(line) 
于 2013-05-16T09:14:01.440 回答
1

也许您可以按照正则表达式的思路思考:

如果我理解正确,您想在某个文件中获取关键字 *Node 和 *Element 之间的数据,对吗?

好吧,您可以尝试以下方法:

import re

S = open('C:/Abaqus_JOBS' + JobDir + '/' + JobName + '-3_4.inp','r').read() 
Data =  re.finditer( "\*Nonde([.\n]*?)\*Element", S )

这应该会给你一个在标签“*Node”和“*Elements”之间找到的字符串列表

我希望那是你想要做的。干杯

于 2013-05-16T07:17:22.177 回答