はじめに
pyedflibの使い方やedfファイルの読み込み方については既に@tchkwkzkさんの記事があるためそちらを参照ください。
EDFファイルの上書き
EDFファイルに書き込むこと自体はpyedflib.EdfWriter
で可能ですが、EdfWriterは元のファイルを初期化してから書き込むため上書きできません。
対策としてedfファイルを複製し、複製したファイルに上書きします。
import pyedflib
#-----------------
def get_all_signals(edf:pyedflib.EdfReader):
"""
edfファイルから全チャンネルの波形を取得して返します。
"""
ewavs = []
for idx,_ in enumerate(edf.getSignalLabels()):
ewavs.append(edf.readSignal(idx))
return ewavs
def copy(redf:pyedflib.EdfReader,copy_path:str,copied_func = None):
"""
redfの内容をコピーパスへコピーします。
copied_funcの第一引数にredf,第二引数にwedfを返します。
"""
ch = len(redf.getSignalHeaders())
with pyedflib.EdfWriter(copy_path,ch) as wedf:
header = redf.getHeader()
#header["birthdate"] = "" 元のedfファイルが日付フォーマットのルールに従っていない場合フォーマットエラーが出るため birthdateを空文字に置き換えて回避します。
annos = redf.readAnnotations()
wedf.setHeader(header)
wedf.setSignalHeaders(redf.getSignalHeaders())
wedf.writeSamples(get_all_signals(redf))
for i,_ in enumerate(annos[0]):
wedf.writeAnnotation(annos[0][i],annos[1][i],annos[2][i])
if not (copied_func is None):
copied_func(redf,wedf)
wedf.close()
return ch
ヘッダー情報のbirthdateが適当に設定されているファイルだとエラーが出る可能性があります。その場合コメントアウトしている部分を利用してください。
使うとき(例:アノテーションを追加する)
EDF_PATH = "*****"
OUT_EDF_PATH = "*****"
edf_reader = pyedflib.EdfReader(EDF_PATH)
def copied_func(redf:pyedflib.EdfReader,wedf:pyedflib.EdfWriter):
wedf.writeAnnotation(ot,-1,"action") #アノテーションを設定
copy(edf_reader,OUT_EDF_PATH,copied_func)
おわりに
もしコピーできていない項目があればコメントで教えていただけると幸いです。
また、pyedflibの使い方をまとめてくださった@tchkwkzkさんに感謝します。