@@ -67,10 +67,10 @@ def readinto(self, buf):
67
67
return n_read
68
68
69
69
70
- def _gzip_open (filename , mode = 'rb' , compresslevel = 9 ):
70
+ def _gzip_open (filename , mode = 'rb' , compresslevel = 9 , keep_open = False ):
71
71
72
72
# 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 :
74
74
gzip_file = SafeIndexedGzipFile (filename )
75
75
76
76
# Fall-back to built-in GzipFile (wrapped with the BufferedGzipFile class
@@ -101,12 +101,14 @@ class Opener(object):
101
101
\*args : positional arguments
102
102
passed to opening method when `fileish` is str. ``mode``, if not
103
103
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``.
105
107
\*\*kwargs : keyword arguments
106
108
passed to opening method when `fileish` is str. Change of defaults as
107
109
for \*args
108
110
"""
109
- gz_def = (_gzip_open , ('mode' , 'compresslevel' ))
111
+ gz_def = (_gzip_open , ('mode' , 'compresslevel' , 'keep_open' ))
110
112
bz2_def = (bz2 .BZ2File , ('mode' , 'buffering' , 'compresslevel' ))
111
113
compress_ext_map = {
112
114
'.gz' : gz_def ,
@@ -117,6 +119,9 @@ class Opener(object):
117
119
default_compresslevel = 1
118
120
#: whether to ignore case looking for compression extensions
119
121
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
120
125
121
126
def __init__ (self , fileish , * args , ** kwargs ):
122
127
if self ._is_fileobj (fileish ):
@@ -132,8 +137,16 @@ def __init__(self, fileish, *args, **kwargs):
132
137
# Set default mode
133
138
if 'mode' not in full_kwargs :
134
139
kwargs ['mode' ] = 'rb'
140
+ # Default compression level
135
141
if 'compresslevel' in arg_names and 'compresslevel' not in kwargs :
136
142
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 )
137
150
self .fobj = opener (fileish , * args , ** kwargs )
138
151
self ._name = fileish
139
152
self .me_opened = True
0 commit comments