diff --git a/Lib/test/test_gzip.py b/Lib/test/test_gzip.py
index 2ddebaf..baa38d4 100644
--- a/Lib/test/test_gzip.py
+++ b/Lib/test/test_gzip.py
@@ -33,14 +33,15 @@
 
 
     def test_write(self):
-        f = gzip.GzipFile(self.filename, 'wb') ; f.write(data1 * 50)
+        with gzip.GzipFile(self.filename, 'wb') as f:
+            f.write(data1 * 50)
 
-        # Try flush and fileno.
-        f.flush()
-        f.fileno()
-        if hasattr(os, 'fsync'):
-            os.fsync(f.fileno())
-        f.close()
+            # Try flush and fileno.
+            f.flush()
+            f.fileno()
+            if hasattr(os, 'fsync'):
+                os.fsync(f.fileno())
+            f.close()
 
         # Test multiple close() calls.
         f.close()
@@ -48,7 +49,8 @@
     def test_read(self):
         self.test_write()
         # Try reading.
-        f = gzip.GzipFile(self.filename, 'r') ; d = f.read() ; f.close()
+        with gzip.GzipFile(self.filename, 'r') as f:
+            d = f.read()
         self.assertEqual(d, data1*50)
 
     def test_io_on_closed_object(self):
@@ -69,38 +71,37 @@
         f = gzip.GzipFile(self.filename, 'w')
         f.close()
         with self.assertRaises(ValueError):
-            f.write(b'')
+            f.write('')
         with self.assertRaises(ValueError):
             f.flush()
 
     def test_append(self):
         self.test_write()
         # Append to the previous file
-        f = gzip.GzipFile(self.filename, 'ab') ; f.write(data2 * 15) ; f.close()
+        with gzip.GzipFile(self.filename, 'ab') as f:
+            f.write(data2 * 15)
 
-        f = gzip.GzipFile(self.filename, 'rb') ; d = f.read() ; f.close()
+        with gzip.GzipFile(self.filename, 'rb') as f:
+            d = f.read()
         self.assertEqual(d, (data1*50) + (data2*15))
 
     def test_many_append(self):
         # Bug #1074261 was triggered when reading a file that contained
         # many, many members.  Create such a file and verify that reading it
         # works.
-        f = gzip.open(self.filename, 'wb', 9)
-        f.write('a')
-        f.close()
-        for i in range(0,200):
-            f = gzip.open(self.filename, "ab", 9) # append
+        with gzip.open(self.filename, 'wb', 9) as f:
             f.write('a')
-            f.close()
+        for i in range(0, 200):
+            with gzip.open(self.filename, "ab", 9) as f: # append
+                f.write('a')
 
         # Try reading the file
-        zgfile = gzip.open(self.filename, "rb")
-        contents = ""
-        while 1:
-            ztxt = zgfile.read(8192)
-            contents += ztxt
-            if not ztxt: break
-        zgfile.close()
+        with gzip.open(self.filename, "rb") as zgfile:
+            contents = ""
+            while 1:
+                ztxt = zgfile.read(8192)
+                contents += ztxt
+                if not ztxt: break
         self.assertEquals(contents, 'a'*201)
 
     def test_buffered_reader(self):
@@ -108,9 +109,9 @@
         # performance.
         self.test_write()
 
-        f = gzip.GzipFile(self.filename, 'rb')
-        with io.BufferedReader(f) as r:
-            lines = [line for line in r]
+        with gzip.GzipFile(self.filename, 'rb') as f:
+            with io.BufferedReader(f) as r:
+                lines = [line for line in r]
 
         self.assertEqual(lines, 50 * data1.splitlines(True))
 
@@ -118,140 +119,127 @@
         self.test_write()
         # Try .readline() with varying line lengths
 
-        f = gzip.GzipFile(self.filename, 'rb')
-        line_length = 0
-        while 1:
-            L = f.readline(line_length)
-            if L == "" and line_length != 0: break
-            self.assertTrue(len(L) <= line_length)
-            line_length = (line_length + 1) % 50
-        f.close()
+        with gzip.GzipFile(self.filename, 'rb') as f:
+            line_length = 0
+            while 1:
+                L = f.readline(line_length)
+                if not L and line_length != 0: break
+                self.assertTrue(len(L) <= line_length)
+                line_length = (line_length + 1) % 50
 
     def test_readlines(self):
         self.test_write()
         # Try .readlines()
 
-        f = gzip.GzipFile(self.filename, 'rb')
-        L = f.readlines()
-        f.close()
+        with gzip.GzipFile(self.filename, 'rb') as f:
+            L = f.readlines()
 
-        f = gzip.GzipFile(self.filename, 'rb')
-        while 1:
-            L = f.readlines(150)
-            if L == []: break
-        f.close()
+        with gzip.GzipFile(self.filename, 'rb') as f:
+            while 1:
+                L = f.readlines(150)
+                if L == []: break
 
     def test_seek_read(self):
         self.test_write()
         # Try seek, read test
 
-        f = gzip.GzipFile(self.filename)
-        while 1:
-            oldpos = f.tell()
-            line1 = f.readline()
-            if not line1: break
-            newpos = f.tell()
-            f.seek(oldpos)  # negative seek
-            if len(line1)>10:
-                amount = 10
-            else:
-                amount = len(line1)
-            line2 = f.read(amount)
-            self.assertEqual(line1[:amount], line2)
-            f.seek(newpos)  # positive seek
-        f.close()
+        with gzip.GzipFile(self.filename) as f:
+            while 1:
+                oldpos = f.tell()
+                line1 = f.readline()
+                if not line1: break
+                newpos = f.tell()
+                f.seek(oldpos)  # negative seek
+                if len(line1)>10:
+                    amount = 10
+                else:
+                    amount = len(line1)
+                line2 = f.read(amount)
+                self.assertEqual(line1[:amount], line2)
+                f.seek(newpos)  # positive seek
 
     def test_seek_whence(self):
         self.test_write()
         # Try seek(whence=1), read test
 
-        f = gzip.GzipFile(self.filename)
-        f.read(10)
-        f.seek(10, whence=1)
-        y = f.read(10)
-        f.close()
+        with gzip.GzipFile(self.filename) as f:
+            f.read(10)
+            f.seek(10, whence=1)
+            y = f.read(10)
         self.assertEquals(y, data1[20:30])
 
     def test_seek_write(self):
         # Try seek, write test
-        f = gzip.GzipFile(self.filename, 'w')
-        for pos in range(0, 256, 16):
-            f.seek(pos)
-            f.write('GZ\n')
-        f.close()
+        with gzip.GzipFile(self.filename, 'w') as f:
+            for pos in range(0, 256, 16):
+                f.seek(pos)
+                f.write('GZ\n')
 
     def test_mode(self):
         self.test_write()
-        f = gzip.GzipFile(self.filename, 'r')
-        self.assertEqual(f.myfileobj.mode, 'rb')
-        f.close()
+        with gzip.GzipFile(self.filename, 'r') as f:
+            self.assertEqual(f.myfileobj.mode, 'rb')
 
     def test_1647484(self):
         for mode in ('wb', 'rb'):
-            f = gzip.GzipFile(self.filename, mode)
-            self.assertTrue(hasattr(f, "name"))
-            self.assertEqual(f.name, self.filename)
-            f.close()
+            with gzip.GzipFile(self.filename, mode) as f:
+                self.assertTrue(hasattr(f, "name"))
+                self.assertEqual(f.name, self.filename)
 
     def test_mtime(self):
         mtime = 123456789
-        fWrite = gzip.GzipFile(self.filename, 'w', mtime = mtime)
-        fWrite.write(data1)
-        fWrite.close()
-        fRead = gzip.GzipFile(self.filename)
-        dataRead = fRead.read()
-        self.assertEqual(dataRead, data1)
-        self.assertTrue(hasattr(fRead, 'mtime'))
-        self.assertEqual(fRead.mtime, mtime)
-        fRead.close()
+        with gzip.GzipFile(self.filename, 'w', mtime = mtime) as fWrite:
+            fWrite.write(data1)
+        with gzip.GzipFile(self.filename) as fRead:
+            dataRead = fRead.read()
+            self.assertEqual(dataRead, data1)
+            self.assertTrue(hasattr(fRead, 'mtime'))
+            self.assertEqual(fRead.mtime, mtime)
 
     def test_metadata(self):
         mtime = 123456789
 
-        fWrite = gzip.GzipFile(self.filename, 'w', mtime = mtime)
-        fWrite.write(data1)
-        fWrite.close()
+        with gzip.GzipFile(self.filename, 'w', mtime = mtime) as fWrite:
+            fWrite.write(data1)
 
-        fRead = open(self.filename, 'rb')
+        with open(self.filename, 'rb') as fRead:
+            # see RFC 1952: http://www.faqs.org/rfcs/rfc1952.html
 
-        # see RFC 1952: http://www.faqs.org/rfcs/rfc1952.html
+            idBytes = fRead.read(2)
+            self.assertEqual(idBytes, '\x1f\x8b') # gzip ID
 
-        idBytes = fRead.read(2)
-        self.assertEqual(idBytes, '\x1f\x8b') # gzip ID
+            cmByte = fRead.read(1)
+            self.assertEqual(cmByte, '\x08') # deflate
 
-        cmByte = fRead.read(1)
-        self.assertEqual(cmByte, '\x08') # deflate
+            flagsByte = fRead.read(1)
+            self.assertEqual(flagsByte, '\x08') # only the FNAME flag is set
 
-        flagsByte = fRead.read(1)
-        self.assertEqual(flagsByte, '\x08') # only the FNAME flag is set
+            mtimeBytes = fRead.read(4)
+            self.assertEqual(mtimeBytes, struct.pack('<i', mtime)) # little-endian
 
-        mtimeBytes = fRead.read(4)
-        self.assertEqual(mtimeBytes, struct.pack('<i', mtime)) # little-endian
+            xflByte = fRead.read(1)
+            self.assertEqual(xflByte, '\x02') # maximum compression
 
-        xflByte = fRead.read(1)
-        self.assertEqual(xflByte, '\x02') # maximum compression
+            osByte = fRead.read(1)
+            self.assertEqual(osByte, '\xff') # OS "unknown" (OS-independent)
 
-        osByte = fRead.read(1)
-        self.assertEqual(osByte, '\xff') # OS "unknown" (OS-independent)
+            # Since the FNAME flag is set, the zero-terminated filename follows.
+            # RFC 1952 specifies that this is the name of the input file, if any.
+            # However, the gzip module defaults to storing the name of the output
+            # file in this field.
+            expected = self.filename.encode('Latin-1') + '\x00'
+            nameBytes = fRead.read(len(expected))
+            self.assertEqual(nameBytes, expected)
 
-        # Since the FNAME flag is set, the zero-terminated filename follows.
-        # RFC 1952 specifies that this is the name of the input file, if any.
-        # However, the gzip module defaults to storing the name of the output
-        # file in this field.
-        nameBytes = fRead.read(len(self.filename) + 1)
-        self.assertEqual(nameBytes, self.filename + '\x00')
+            # Since no other flags were set, the header ends here.
+            # Rather than process the compressed data, let's seek to the trailer.
+            fRead.seek(os.stat(self.filename).st_size - 8)
 
-        # Since no other flags were set, the header ends here.
-        # Rather than process the compressed data, let's seek to the trailer.
-        fRead.seek(os.stat(self.filename).st_size - 8)
+            crc32Bytes = fRead.read(4) # CRC32 of uncompressed data [data1]
+            self.assertEqual(crc32Bytes, '\xaf\xd7d\x83')
 
-        crc32Bytes = fRead.read(4) # CRC32 of uncompressed data [data1]
-        self.assertEqual(crc32Bytes, '\xaf\xd7d\x83')
-
-        isizeBytes = fRead.read(4)
-        self.assertEqual(isizeBytes, struct.pack('<i', len(data1)))
-
-        fRead.close()
+            isizeBytes = fRead.read(4)
+            self.assertEqual(isizeBytes, struct.pack('<i', len(data1)))
 
     def test_with_open(self):
         # GzipFile supports the context management protocol
