Извлечение информации из входного файла Abaqus

У меня есть файл cae с кучей разных моделей и шагов внутри моделей, и мне нужен быстрый способ вытащить нагрузки теплового потока тела из входной модели, чтобы проверить их.

Есть ли способ написать что-то, что проходит через входные файлы, извлекает нагрузки, которые я ищу, и записывает их в файл .txt для проверки?

Ниже приведена часть входного файла, содержащая информацию, которую я хочу захватить.

** STEP: StepName
** LOADS
** 
** Name: Capsule   Type: Body heat flux
*Dflux, amplitude=Power
Capsule-1.Capsule, BF, 4685.4
** Name: Fuel   Type: Body heat flux
*Dflux
Fuel-1.Fuel, BF, 431422.
** Name: Rodlet   Type: Body heat flux
*Dflux, amplitude=Power
Rodlet-1.Rodlet, BF, 4659.5
** Name: Spacer   Type: Body heat flux
*Dflux, amplitude=Power
Spacer, BF, 7022.2

На мой первоначальный вопрос, опубликованный выше, был дан ответ, но я хотел бы добавить немного больше к этому вопросу. У меня есть несколько входных файлов, через которые я хотел бы запустить этот скрипт, и хотел бы, чтобы результирующий выходной файл содержал список входных файлов, stepName, LoadName и Load в одной строке. Таким образом, я могу копировать и вставлять в Excel (если я не смогу вывести его в Excel, это сэкономит мне шаг), и я смогу отсортировать все загрузки и узнать, к какому файлу и шагу они относятся.

Я попытался использовать глобус импорта, а затем извлечь информацию из всех входных файлов в каталоге, но я не могу записать информацию в выходной файл так, как я хочу.

import re
import os
import glob

# Open output file for writing
outputFile = open('ATF_Loads.txt','w')

inputfileList = glob.glob('./*.inp')

for inputfile in inputfileList:

    with open(inputfile, 'r') as inpDeck:
        lines = inpDeck.read()

    lines=re.findall(r"^\*Dflux(|,\s*amplitude=[^,]*?)\n([^,]*?),\s*BF\s*,([^,]*?\n)",lines, flags=re.IGNORECASE|re.MULTILINE)

    for line in lines:
        outputFile.write(','.join(line))

person haledaco    schedule 30.11.2015    source источник
comment
Я не знаю, есть ли что-то вроде существующего модуля или подобного. Однако не могли бы вы предоставить фрагмент этого входного файла, чтобы получить представление о том, как вы можете обрабатывать данные из файла?   -  person albert    schedule 30.11.2015
comment
** НАГРУЗКИ ** ** Название: Тип капсулы: Тепловой поток тела *Dflux, амплитуда=Power Capsule-1.Capsule, BF, 4685.4 ** Название: Тип топлива: Тепловой поток тела *Dflux Fuel-1.Fuel, BF, 431422. ** Название: Тип стержня: Тепловой поток тела *Dflux, амплитуда=Power Rodlet-1.Rodlet, BF, 4659.5 ** Название: Тип распорки: Тепловой поток тела *Dflux, амплитуда=Power Spacer, BF, 7022.2   -  person haledaco    schedule 30.11.2015
comment
Комментарий выше — это часть входного файла, из которого я хочу извлечь данные. конкретная нагрузка, которую я хочу тянуть, - это топливная нагрузка (431422)   -  person haledaco    schedule 30.11.2015
comment
Пожалуйста, добавьте этот фрагмент к своему вопросу, отредактировав свой вопрос, поскольку форматирование может стать важным. Поэтому, пожалуйста, отформатируйте фрагмент точно так же, как исходный файл, который у вас есть.   -  person albert    schedule 30.11.2015
comment
Я добавил фрагмент к своему вопросу.   -  person haledaco    schedule 30.11.2015
comment
входной файл может быть не лучшим способом сделать это. Возможно, вам следует подумать о доступе к этой информации непосредственно из базы данных модели в файле CAE. для этого вам понадобится скрипт python.   -  person will    schedule 01.12.2015
comment
это действительно просто в питоне. Покажите попытку, чтобы люди знали, где у вас возникли проблемы.   -  person agentp    schedule 04.12.2015


Ответы (1)


Возможно, вы могли бы использовать регулярные выражения....

import re
import os

directory=r'C:\Users\Doug\Desktop'
fileName='sampleDeck'

file_fullPathName=os.path.join(directory, fileName + '.inp') 

with open(file_fullPathName, 'r') as inpDeck:
    lines = inpDeck.read()

lines=re.findall(r"^\*Dflux(|,\s*amplitude=[^,]*?)\n([^,]*?),\s*BF\s*,([^,]*?\n)",lines, flags=re.IGNORECASE|re.MULTILINE)

file_fullPathName=os.path.join(directory, fileName + '-out.txt') 
with open(file_fullPathName, "w") as outp:
    for line in lines:
        outp.write(','.join(line))  #Write text file
person DougR    schedule 04.12.2015
comment
Это сработало отлично! Спасибо. Если у вас есть время, вы можете помочь мне с небольшим дополнением к нему. У меня есть несколько входных файлов, которые я хотел бы пройти, и в этом входном файле есть много шагов, из которых он загружается. Я хотел бы организовать выходной файл так, чтобы он показывал входной файл, имя шага, имя загрузки, значение загрузки. Я собираюсь отредактировать свой первоначальный вопрос, чтобы показать, как называются разные имена шагов. - person haledaco; 07.12.2015
comment
Если у вас есть время, я также был бы признателен, если бы вы могли объяснить команду lines.refindall, которую вы поместили в этот скрипт. Это очень помогло бы мне, если бы я мог сам разобраться в этом, или если у вас есть ссылка на что-то, что могло бы помочь мне понять это. - person haledaco; 08.12.2015
comment
команда re.findall содержит регулярное выражение для поиска совпадений в фрагменте текста. Регулярные выражения — это почти язык сам по себе, и есть несколько хороших веб-сайтов, которые объясняют это. Используйте это, чтобы проверить их pyregex.com. - person DougR; 08.12.2015
comment
Чтобы найти каждый фрагмент текста, связанный с шагами в вашем файле ввода, возможно, вы могли бы использовать что-то вроде этого: - re.findall(r^**STEP: ((.*?)\n.*\n(?=* *STEP),lines, flags=re.IGNORECASE|re.MULTILINE|re.DOTALL). Я не проверял эту команду, поэтому вам придется немного поэкспериментировать. Затем создайте цикл for для циклического прохождения каждого шага, чтобы найти DFLUX. (используя другое регулярное выражение).Если вам потребуются какие-либо консультационные услуги Abaqus, мы можем предоставить их... очевидно, за определенную плату :-) - person DougR; 08.12.2015