forked from sromanuk/pyedf
-
Notifications
You must be signed in to change notification settings - Fork 0
/
pyedf.py
64 lines (58 loc) · 1.83 KB
/
pyedf.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#!/usr/bin/env python
# encoding: utf-8
"""
pyedf.py
Created by Ray Slakinski on 2010-09-14.
Copyright (c) 2010 Ray Slakinski. All rights reserved.
"""
import sys
import argparse
import re
def read_edf_file(fileobj):
data = fileobj.read()
header = {}
# Parse header information based on the EDF/EDF+ specs
# http://www.edfplus.info/specs/index.html
header['version'] = data[0:7].strip()
header['patient_id'] = data[7:88].strip()
header['rec_id'] = data[88:168].strip()
header['startdate'] = data[168:176].strip()
header['starttime'] = data[176:184].strip()
header['header_bytes'] = int(data[184:192].strip())
header['num_items'] = int(data[236:244].strip())
header['data_duration'] = float(data[244:252].strip())
header['num_signals'] = int(data[252:256].strip())
# more data 256 chars down. in header, but ignoring for now
records = []
records_a = records.append
rec_pos = 512
rec_size = 36
# skip first rec
rec_pos += rec_size
for i in range(header['num_items']-1):
record = {}
record_split = data[rec_pos:rec_pos+rec_size].split('\x14')
matches = re.findall(r'([\d]+)', record_split[2])
record['type'] = record_split[3].strip()
record['time'] = {
'start': int(matches[0]),
'durration': int(matches[1]),
}
records_a(record)
rec_pos += rec_size
return {'header': header, 'records': records}
def main():
# create the parser
parser = argparse.ArgumentParser(description='Process a given EDF File.')
parser.add_argument(
'-f',
'--file',
type=argparse.FileType('r'),
help='EDF File to be processed.',
)
args = parser.parse_args()
data = read_edf_file(args.file)
args.file.close()
print data
if __name__ == '__main__':
main()