@@ -202,51 +202,58 @@ def __init__(self, filename=None, mode=None,
202
202
raise ValueError ("Invalid mode: {!r}" .format (mode ))
203
203
if mode and 'b' not in mode :
204
204
mode += 'b'
205
- if fileobj is None :
206
- fileobj = self .myfileobj = builtins .open (filename , mode or 'rb' )
207
- if filename is None :
208
- filename = getattr (fileobj , 'name' , '' )
209
- if not isinstance (filename , (str , bytes )):
210
- filename = ''
211
- else :
212
- filename = os .fspath (filename )
213
- origmode = mode
214
- if mode is None :
215
- mode = getattr (fileobj , 'mode' , 'rb' )
216
-
217
-
218
- if mode .startswith ('r' ):
219
- self .mode = READ
220
- raw = _GzipReader (fileobj )
221
- self ._buffer = io .BufferedReader (raw )
222
- self .name = filename
223
-
224
- elif mode .startswith (('w' , 'a' , 'x' )):
225
- if origmode is None :
226
- import warnings
227
- warnings .warn (
228
- "GzipFile was opened for writing, but this will "
229
- "change in future Python releases. "
230
- "Specify the mode argument for opening it for writing." ,
231
- FutureWarning , 2 )
232
- self .mode = WRITE
233
- self ._init_write (filename )
234
- self .compress = zlib .compressobj (compresslevel ,
235
- zlib .DEFLATED ,
236
- - zlib .MAX_WBITS ,
237
- zlib .DEF_MEM_LEVEL ,
238
- 0 )
239
- self ._write_mtime = mtime
240
- self ._buffer_size = _WRITE_BUFFER_SIZE
241
- self ._buffer = io .BufferedWriter (_WriteBufferStream (self ),
242
- buffer_size = self ._buffer_size )
243
- else :
244
- raise ValueError ("Invalid mode: {!r}" .format (mode ))
245
205
246
- self .fileobj = fileobj
206
+ try :
207
+ if fileobj is None :
208
+ fileobj = self .myfileobj = builtins .open (filename , mode or 'rb' )
209
+ if filename is None :
210
+ filename = getattr (fileobj , 'name' , '' )
211
+ if not isinstance (filename , (str , bytes )):
212
+ filename = ''
213
+ else :
214
+ filename = os .fspath (filename )
215
+ origmode = mode
216
+ if mode is None :
217
+ mode = getattr (fileobj , 'mode' , 'rb' )
218
+
219
+
220
+ if mode .startswith ('r' ):
221
+ self .mode = READ
222
+ raw = _GzipReader (fileobj )
223
+ self ._buffer = io .BufferedReader (raw )
224
+ self .name = filename
225
+
226
+ elif mode .startswith (('w' , 'a' , 'x' )):
227
+ if origmode is None :
228
+ import warnings
229
+ warnings .warn (
230
+ "GzipFile was opened for writing, but this will "
231
+ "change in future Python releases. "
232
+ "Specify the mode argument for opening it for writing." ,
233
+ FutureWarning , 2 )
234
+ self .mode = WRITE
235
+ self ._init_write (filename )
236
+ self .compress = zlib .compressobj (compresslevel ,
237
+ zlib .DEFLATED ,
238
+ - zlib .MAX_WBITS ,
239
+ zlib .DEF_MEM_LEVEL ,
240
+ 0 )
241
+ self ._write_mtime = mtime
242
+ self ._buffer_size = _WRITE_BUFFER_SIZE
243
+ self ._buffer = io .BufferedWriter (_WriteBufferStream (self ),
244
+ buffer_size = self ._buffer_size )
245
+ else :
246
+ raise ValueError ("Invalid mode: {!r}" .format (mode ))
247
+
248
+ self .fileobj = fileobj
247
249
248
- if self .mode == WRITE :
249
- self ._write_gzip_header (compresslevel )
250
+ if self .mode == WRITE :
251
+ self ._write_gzip_header (compresslevel )
252
+ except :
253
+ # Avoid a ResourceWarning if the write fails,
254
+ # eg read-only file or KeyboardInterrupt
255
+ self ._close ()
256
+ raise
250
257
251
258
@property
252
259
def mtime (self ):
@@ -387,11 +394,14 @@ def close(self):
387
394
elif self .mode == READ :
388
395
self ._buffer .close ()
389
396
finally :
390
- self .fileobj = None
391
- myfileobj = self .myfileobj
392
- if myfileobj :
393
- self .myfileobj = None
394
- myfileobj .close ()
397
+ self ._close ()
398
+
399
+ def _close (self ):
400
+ self .fileobj = None
401
+ myfileobj = self .myfileobj
402
+ if myfileobj is not None :
403
+ self .myfileobj = None
404
+ myfileobj .close ()
395
405
396
406
def flush (self ,zlib_mode = zlib .Z_SYNC_FLUSH ):
397
407
self ._check_not_closed ()
0 commit comments