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