본문 바로가기
시뮬레이션 기반 사이언스

[파이썬 실전] 양자 화학 시뮬레이션(ORCA/VASP) 로그 파일에서 핵심 데이터 자동 추출하기 (정규표현식 활용)

by 지식보따리상상 2026. 4. 21.

이전 시리즈들에서 우리는 계산 화학 및 다중 물리 시뮬레이션의 효율을 극대화하기 위한 파이썬(Python) 기반의 워크플로우 자동화 개념을 살펴보았습니다. 이번 포스팅부터는 실제 연구 현장에서 즉시 복사하여 사용할 수 있는 실전 파이썬 스크립트를 하나씩 리뷰해 보겠습니다. 첫 번째 주제는 밀도범함수이론(DFT) 시뮬레이션 직후 가장 먼저 마주하게 되는 '데이터 파싱(Data Parsing)' 작업입니다. ORCA나 VASP와 같은 양자 화학 프로그램이 뱉어내는 방대한 텍스트 로그 파일에서 우리가 원하는 정확한 수치만 1초 만에 추출하여 엑셀(CSV) 파일로 정리하는 강력한 자동화 코드를 소개합니다.


1. 수작업 데이터 수집의 한계와 방대한 출력(Output) 파일의 구조

촉매의 반응성이나 금속유기골격체(MOFs)의 가스 흡착 에너지를 계산하기 위해 수십 개의 구조 모델을 슈퍼컴퓨터에서 병렬로 돌리고 나면, 결과물로 수십 개의 로그 파일(.out 또는 OUTCAR)이 생성됩니다. 이 파일들은 적게는 수천 줄에서 많게는 수백만 줄에 달하는 방대한 텍스트로 이루어져 있습니다. 시스템의 총 에너지(Total Energy), HOMO-LUMO 갭, 원자 간 결합 길이 등의 핵심 정보는 이 텍스트의 바다 어딘가에 숨어 있습니다.

이러한 정보들을 메모장으로 일일이 열어 'Ctrl+F' 키로 검색한 뒤 수작업으로 복사하여 엑셀에 붙여넣는 과정은 극도로 비효율적입니다. 수십 개의 파일을 처리하다 보면 필연적으로 복사 실수가 발생하며, 이는 곧 치명적인 연구 오류로 이어집니다. 파이썬을 활용하면 이 모든 과정을 사람의 개입 없이 100% 정확하게 자동화할 수 있습니다.


2. 정규표현식(Regular Expression): 텍스트의 바다에서 진주 찾기

파이썬 스크립트가 텍스트 파일 안에서 우리가 원하는 데이터만 정확히 집어내도록 지시하려면 정규표현식(Regular Expression, 파이썬의 're' 모듈)을 이해해야 합니다. 정규표현식은 특정한 규칙을 가진 문자열의 패턴을 표현하는 강력한 형식 언어입니다.

예를 들어, ORCA 시뮬레이션 결과 파일에서 최종 에너지는 항상 "FINAL SINGLE POINT ENERGY"라는 문구 뒤에 일정한 공백을 두고 소수점 형태의 숫자로 나타납니다. 우리는 파이썬의 're.compile()' 함수를 사용하여 이 문구 뒤에 오는 '숫자 패턴'만을 캡처하라는 명령을 내릴 수 있습니다. 이 방식을 사용하면 파일의 전체 줄 수가 변하거나 쓰레기 값이 섞여 있더라도, 스크립트는 패턴이 일치하는 정확한 에너지 값만을 귀신같이 찾아냅니다.


3. 실전 파이썬 코드 리뷰: 단일점 에너지(Single Point Energy) 추출기

아래는 지정된 폴더 내의 모든 ORCA 출력 파일(.out)을 순회하며 최종 에너지를 추출하는 실전 파이썬 스크립트의 핵심 구조입니다. 코드의 간결성을 위해 파이썬 내장 모듈인 'os'와 're'를 사용했습니다.



import os
import re
import pandas as pd
import glob

# 1. ORCA 출력 파일들이 있는 폴더 경로 설정 및 파일 목록 불러오기
file_path = './simulation_results/*.out'
file_list = glob.glob(file_path)

# 2. 추출할 데이터 패턴 정의 (정규표현식)
# "FINAL SINGLE POINT ENERGY" 뒤에 오는 숫자(소수점 포함)를 그룹화하여 찾음
energy_pattern = re.compile(r"FINAL SINGLE POINT ENERGY\s+(-?\d+\.\d+)")

# 3. 결과를 저장할 빈 리스트 생성
extracted_data = []

# 4. 반복문을 통한 파일 파싱
for file_name in file_list:
    with open(file_name, 'r') as file:
        content = file.read()
        match = energy_pattern.search(content)
        
        if match:
            # 매칭된 숫자 그룹(group 1)을 가져와 float형으로 변환
            energy_value = float(match.group(1))
            extracted_data.append({'FileName': os.path.basename(file_name), 'Energy(Eh)': energy_value})
        else:
            print(f"Warning: Energy not found in {file_name}")

# 5. 수집된 데이터를 Pandas 데이터프레임으로 변환
df = pd.DataFrame(extracted_data)
print(df)

4. 대규모 데이터를 Pandas를 통해 CSV로 저장 및 확장 활용

위 코드에서 주목해야 할 부분은 파이썬의 강력한 데이터 분석 라이브러리인 'Pandas'의 활용입니다. 정규표현식으로 추출된 수십, 수백 개의 데이터는 딕셔너리(Dictionary) 형태로 리스트에 차곡차곡 쌓입니다. 코딩의 마지막 단계인 `pd.DataFrame()` 함수는 이 리스트를 엑셀과 동일한 형태의 2차원 표(Table) 구조로 단숨에 변환해 줍니다.

이렇게 데이터프레임으로 변환된 정보는 `df.to_csv("result_energies.csv", index=False)`라는 단 한 줄의 코드를 추가하는 것만으로 바탕화면에 깔끔한 CSV 파일로 저장됩니다. 연구자는 퇴근하기 전 이 스크립트를 실행해 두고, 다음 날 아침 출근하여 완벽하게 정리된 CSV 파일을 열어 논문에 들어갈 그래프를 그리기만 하면 됩니다. 만약 밴드갭이나 전하량(Charge) 등 추가적인 데이터가 필요하다면, 스크립트 상단의 'energy_pattern' 부분에 새로운 정규표현식 규칙만 한 줄 추가해 주면 응용은 무궁무진합니다.


결론: 코딩 한 줄이 덜어주는 연구자의 수고로움

단순 반복 업무에서 해방되는 것, 그것이 파이썬을 시뮬레이션 연구에 도입해야 하는 가장 원초적인 이유입니다. 오늘 소개한 정규표현식과 Pandas를 결합한 자동 파싱 스크립트는 계산 화학뿐만 아니라, 열유체 해석, 구조 역학 등 텍스트 로그 기반의 결과를 내놓는 모든 공학 시뮬레이션 분야에 동일하게 적용할 수 있는 마스터키와 같습니다. 본 포스팅의 코드를 복사하여 여러분의 연구 환경에 맞게 경로와 패턴 문구만 조금씩 수정해 보시기 바랍니다. 이어지는 다음 실전 튜토리얼에서는 복잡한 텍스트 데이터를 넘어, 시뮬레이션으로 얻어진 3차원 분자 구조를 컴퓨터 환경에서 무료로 가장 아름답게 시각화할 수 있는 소프트웨어 3가지를 전격 비교 분석해 보겠습니다.