@@ -195,51 +195,58 @@ def __init__(self, filename=None, mode=None,
195
195
raise ValueError ("Invalid mode: {!r}" .format (mode ))
196
196
if mode and 'b' not in mode :
197
197
mode += 'b'
198
- if fileobj is None :
199
- fileobj = self .myfileobj = builtins .open (filename , mode or 'rb' )
200
- if filename is None :
201
- filename = getattr (fileobj , 'name' , '' )
202
- if not isinstance (filename , (str , bytes )):
203
- filename = ''
204
- else :
205
- filename = os .fspath (filename )
206
- origmode = mode
207
- if mode is None :
208
- mode = getattr (fileobj , 'mode' , 'rb' )
209
-
210
-
211
- if mode .startswith ('r' ):
212
- self .mode = READ
213
- raw = _GzipReader (fileobj )
214
- self ._buffer = io .BufferedReader (raw )
215
- self .name = filename
216
-
217
- elif mode .startswith (('w' , 'a' , 'x' )):
218
- if origmode is None :
219
- import warnings
220
- warnings .warn (
221
- "GzipFile was opened for writing, but this will "
222
- "change in future Python releases. "
223
- "Specify the mode argument for opening it for writing." ,
224
- FutureWarning , 2 )
225
- self .mode = WRITE
226
- self ._init_write (filename )
227
- self .compress = zlib .compressobj (compresslevel ,
228
- zlib .DEFLATED ,
229
- - zlib .MAX_WBITS ,
230
- zlib .DEF_MEM_LEVEL ,
231
- 0 )
232
- self ._write_mtime = mtime
233
- self ._buffer_size = _WRITE_BUFFER_SIZE
234
- self ._buffer = io .BufferedWriter (_WriteBufferStream (self ),
235
- buffer_size = self ._buffer_size )
236
- else :
237
- raise ValueError ("Invalid mode: {!r}" .format (mode ))
238
198
239
- self .fileobj = fileobj
199
+ try :
200
+ if fileobj is None :
201
+ fileobj = self .myfileobj = builtins .open (filename , mode or 'rb' )
202
+ if filename is None :
203
+ filename = getattr (fileobj , 'name' , '' )
204
+ if not isinstance (filename , (str , bytes )):
205
+ filename = ''
206
+ else :
207
+ filename = os .fspath (filename )
208
+ origmode = mode
209
+ if mode is None :
210
+ mode = getattr (fileobj , 'mode' , 'rb' )
211
+
212
+
213
+ if mode .startswith ('r' ):
214
+ self .mode = READ
215
+ raw = _GzipReader (fileobj )
216
+ self ._buffer = io .BufferedReader (raw )
217
+ self .name = filename
218
+
219
+ elif mode .startswith (('w' , 'a' , 'x' )):
220
+ if origmode is None :
221
+ import warnings
222
+ warnings .warn (
223
+ "GzipFile was opened for writing, but this will "
224
+ "change in future Python releases. "
225
+ "Specify the mode argument for opening it for writing." ,
226
+ FutureWarning , 2 )
227
+ self .mode = WRITE
228
+ self ._init_write (filename )
229
+ self .compress = zlib .compressobj (compresslevel ,
230
+ zlib .DEFLATED ,
231
+ - zlib .MAX_WBITS ,
232
+ zlib .DEF_MEM_LEVEL ,
233
+ 0 )
234
+ self ._write_mtime = mtime
235
+ self ._buffer_size = _WRITE_BUFFER_SIZE
236
+ self ._buffer = io .BufferedWriter (_WriteBufferStream (self ),
237
+ buffer_size = self ._buffer_size )
238
+ else :
239
+ raise ValueError ("Invalid mode: {!r}" .format (mode ))
240
+
241
+ self .fileobj = fileobj
240
242
241
- if self .mode == WRITE :
242
- self ._write_gzip_header (compresslevel )
243
+ if self .mode == WRITE :
244
+ self ._write_gzip_header (compresslevel )
245
+ except :
246
+ # Avoid a ResourceWarning if the write fails,
247
+ # eg read-only file or KeyboardInterrupt
248
+ self ._close ()
249
+ raise
243
250
244
251
@property
245
252
def mtime (self ):
@@ -368,11 +375,14 @@ def close(self):
368
375
elif self .mode == READ :
369
376
self ._buffer .close ()
370
377
finally :
371
- self .fileobj = None
372
- myfileobj = self .myfileobj
373
- if myfileobj :
374
- self .myfileobj = None
375
- myfileobj .close ()
378
+ self ._close ()
379
+
380
+ def _close (self ):
381
+ self .fileobj = None
382
+ myfileobj = self .myfileobj
383
+ if myfileobj is not None :
384
+ self .myfileobj = None
385
+ myfileobj .close ()
376
386
377
387
def flush (self ,zlib_mode = zlib .Z_SYNC_FLUSH ):
378
388
self ._check_not_closed ()
0 commit comments