지식 요소의 가공과 분석, 그리고 여러가지 도구의 활용에 관한 내용

H5py를 활용한 HDF5 포맷으로 된 데이터 추출.

HDF5 파일포맷을 활용해본적은 없었습니다만, 최근 동료에게 주어진 실험 데이터가 해당 파일포맷을 활용해서 데이터 추출 작업을 할 필요가 생겼습니다. 그래서 동료는 Windows에서 대량의 파일들을 읽어들여 본인이 원하는 포맷으로 데이터를 저장하길 원했습니다. HDF5 포맷 자체는 여러 용도로 사용하고, 키, 그룹 등을 포함한 다양한 구조를 제공합니다만, 저의 경우에는 일단 데이터를 뽑아내서 활용하는게 목적입니다. 먼저 Silx로 확인해보니 구조가 다음과 같이 주어져 있습니다.

  • entry
    • A
      • x
      • y
      • f
    • B
      • x
      • y
      • f

H5py메뉴얼을 바탕으로 보면 HDF5 파일포맷은 각 항목들이 Key로 주어져 있고, 각 내용들도 다시금 Key로 접근할 수 있습니다. 그래서 만약 A나 B에 접근하기 위해서는 (열린 h5 파일을 f_h5라 했을때) h_h5[‘A’] 혹은 h_h5[‘B’]등으로 접근할 수 있습니다. 해당 항목 내부의 키에 다시금 접속하기 위해서는 (h_h5[‘A’])[‘x’] 등으로 접근할 수 있습니다.

다만 설명서를 자세히 읽어보지는 않았으나, 해당 항목의 data array에 접근하기 위해서는 [()]를 추가해주어야 합니다. 다시말해서, A-x에 해당되는 array를 받아오기 위해서는 ((h_h5[‘A’])[‘x’])[()]와 같은 방법을 사용합니다. 혹은, 다음과 같은 여러 라인으로 시인성을 올릴 수 있습니다.

A = h_h5['A']
x_A = (A['x'])[()]

저에게 문의한 동료의 경우 Windows 머신에서 scattering data를 일괄적으로 불러들어와서 ASCII 형태로 출력하는것을 목표로 합니다. Python과 스크립트에 익숙하지 않은 동료를 위해 과정을 편하게 하기 위하여 Jupyter notebook을 사용합니다 (Python의 os 패키지를 활용해서 파일을 불러올 수 있습니다만, Jupyter notebook에서는 Mac/Linux에서는 터미널을 Windows에서는 cmd를 사용할 수 있습니다)

from numpy import *
import h5py
# 윈도우 dir 명령어를 통해서 절대경로를 포함한 파일명을 받아내기
fn_list = !dir /b /s "path\*.h5"
# 윈도우 dir 명령어를 통해서 파일명만을 받아내기
fn_base_list = !dir /b "path\*.h5"
# 테스트를 위해서 10개의 파일만 설정
N_test_number_of_data=10 # this is only for the test purpose
test_fn_within_folder = []
for fn_string in fn_base_list[:N_test_number_of_data]:
    test_fn_within_folder.append(fn_string.split('.')[0]+'_test_A.dat')

# 파일 데이터를 추출하고 저장할 공간 설정
data1d_Ax_arr = []
data1d_Af_arr = []
for i, fn in enumerate(fn_list[:N_test_number_of_data]): 
    with h5py.File(fn, 'r') as f: 
        # asarray: array -> numpy array
        Ax_tmp = asarray((((f['entry'])['A'])['x'])[()]) # asarray: array -> numpy array
        Af_tmp = asarray((((f['entry'])['A'])['f'])[()])
        # numpy array를 python array의 세부항목으로 추가합니다. 
        data1d_Ax_arr.append(Ax_tmp) 
        data1d_Af_arr.append(Af_tmp)
        # 만약에 ascii파일 형태로 저장이 필요할 때
        savetxt(test_fn_within_folder[i], Af_tmp, header='this is header\nnewline is used\ncol[0]=aaa, col[1]=bbb, ...')


Comments

Leave a Reply

Your email address will not be published. Required fields are marked *