@@ -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