From b619562656ca03cef661b5aabe447f548b05073d Mon Sep 17 00:00:00 2001 From: Clemens Brunner Date: Tue, 16 Apr 2019 12:48:57 +0200 Subject: [PATCH] Support pathlib objects --- pyxdf/pyxdf.py | 221 +++++++++++++++++++++++++------------------------ 1 file changed, 113 insertions(+), 108 deletions(-) diff --git a/pyxdf/pyxdf.py b/pyxdf/pyxdf.py index be4ed69..188c55a 100644 --- a/pyxdf/pyxdf.py +++ b/pyxdf/pyxdf.py @@ -12,6 +12,7 @@ import xml.etree.ElementTree as ET from collections import OrderedDict, defaultdict import logging +from pathlib import Path import numpy as np @@ -213,120 +214,124 @@ def __init__(self, xml): filesize = os.path.getsize(filename) # read file contents ([SomeText] below refers to items in the XDF Spec) - with gzip.GzipFile(filename, 'rb') if filename.endswith('.xdfz') else open(filename, 'rb') as f: + filename = Path(filename) # convert to pathlib object + if filename.suffix == '.xdfz' or filename.suffixes == ['.xdf', '.gz']: + f = gzip.open(filename, 'rb') + else: + f = open(filename, 'rb') - # read [MagicCode] - if f.read(4) != b'XDF:': - raise Exception('not a valid XDF file: %s' % filename) + # read [MagicCode] + if f.read(4) != b'XDF:': + raise Exception('not a valid XDF file: %s' % filename) - # for each chunk... - StreamId = None - while True: + # for each chunk... + StreamId = None + while True: + # noinspection PyBroadException + try: + # read [NumLengthBytes], [Length] + chunklen = _read_varlen_int(f) + except Exception: + if f.tell() < filesize - 1024: + logger.warn('got zero-length chunk, scanning forward to ' + 'next boundary chunk.') + _scan_forward(f) + continue + else: + logger.info(' reached end of file.') + break + + # read [Tag] + tag = struct.unpack('