Skip to content

Commit bc49c60

Browse files
committed
RF: ArrayProxy tells Opener whether it intends to keep the file open for
multiple accesses, so Opener knows whether it should use indexed_gzip or not.
1 parent dbe74e1 commit bc49c60

File tree

2 files changed

+19
-6
lines changed

2 files changed

+19
-6
lines changed

nibabel/arrayproxy.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -265,10 +265,10 @@ def _get_fileobj(self):
265265
"""
266266
if self._keep_file_open:
267267
if not hasattr(self, '_opener'):
268-
self._opener = ImageOpener(self.file_like)
268+
self._opener = ImageOpener(self.file_like, keep_open=True)
269269
yield self._opener
270270
else:
271-
with ImageOpener(self.file_like) as opener:
271+
with ImageOpener(self.file_like, keep_open=False) as opener:
272272
yield opener
273273

274274
def get_unscaled(self):

nibabel/openers.py

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -67,10 +67,10 @@ def readinto(self, buf):
6767
return n_read
6868

6969

70-
def _gzip_open(filename, mode='rb', compresslevel=9):
70+
def _gzip_open(filename, mode='rb', compresslevel=9, keep_open=False):
7171

7272
# use indexed_gzip if possible for faster read access
73-
if mode == 'rb' and HAVE_INDEXED_GZIP:
73+
if keep_open and mode == 'rb' and HAVE_INDEXED_GZIP:
7474
gzip_file = SafeIndexedGzipFile(filename)
7575

7676
# Fall-back to built-in GzipFile (wrapped with the BufferedGzipFile class
@@ -101,12 +101,14 @@ class Opener(object):
101101
\*args : positional arguments
102102
passed to opening method when `fileish` is str. ``mode``, if not
103103
specified, is `rb`. ``compresslevel``, if relevant, and not specified,
104-
is set from class variable ``default_compresslevel``
104+
is set from class variable ``default_compresslevel``. ``keep_open``, if
105+
relevant, and not specified, is set from class variable
106+
``default_keep_open``.
105107
\*\*kwargs : keyword arguments
106108
passed to opening method when `fileish` is str. Change of defaults as
107109
for \*args
108110
"""
109-
gz_def = (_gzip_open, ('mode', 'compresslevel'))
111+
gz_def = (_gzip_open, ('mode', 'compresslevel', 'keep_open'))
110112
bz2_def = (bz2.BZ2File, ('mode', 'buffering', 'compresslevel'))
111113
compress_ext_map = {
112114
'.gz': gz_def,
@@ -117,6 +119,9 @@ class Opener(object):
117119
default_compresslevel = 1
118120
#: whether to ignore case looking for compression extensions
119121
compress_ext_icase = True
122+
#: hint which tells us whether the file handle will be kept open for
123+
# multiple reads/writes, or just for one-time access.
124+
default_keep_open = False
120125

121126
def __init__(self, fileish, *args, **kwargs):
122127
if self._is_fileobj(fileish):
@@ -132,8 +137,16 @@ def __init__(self, fileish, *args, **kwargs):
132137
# Set default mode
133138
if 'mode' not in full_kwargs:
134139
kwargs['mode'] = 'rb'
140+
# Default compression level
135141
if 'compresslevel' in arg_names and 'compresslevel' not in kwargs:
136142
kwargs['compresslevel'] = self.default_compresslevel
143+
# Default keep_open hint
144+
if 'keep_open' in arg_names:
145+
if 'keep_open' not in kwargs:
146+
kwargs['keep_open'] = self.default_keep_open
147+
# Clear keep_open hint if it is not relevant for the file type
148+
else:
149+
kwargs.pop('keep_open', None)
137150
self.fobj = opener(fileish, *args, **kwargs)
138151
self._name = fileish
139152
self.me_opened = True

0 commit comments

Comments
 (0)