@@ -36,29 +36,32 @@ def _normalize_names(name: str) -> str:
3636def _open_compressed (fname : Path ) -> str :
3737 """Open compressed gzip, gz, zip or bz2 files."""
3838 extension = fname .suffix .casefold ()
39- if extension in [".gzip" , ".gz" ]:
40- cfile = gzip .open (str (fname ))
41- elif extension == ".bz2" :
42- cfile = bz2 .BZ2File (str (fname ))
43- elif extension == ".zip" :
39+ loaders = {
40+ ".gzip" : gzip .open ,
41+ ".gz" : gzip .open ,
42+ ".bz2" : bz2 .BZ2File ,
43+ ".zip" : zipfile .ZipFile ,
44+ }
45+ loader = loaders .get (extension )
46+ if loader is None :
47+ valid = ", " .join (loaders .keys ())
48+ msg = (
49+ "Unrecognized file extension. "
50+ f"Expected { valid } , got { extension } ."
51+ )
52+ raise ValueError (msg )
53+
54+ if extension == ".zip" :
4455 # NOTE: Zip format may contain more than one file in the archive
4556 # (similar to tar), here we assume that there is just one file per
4657 # zipfile! Also, we ask for the name because it can be different from
4758 # the zipfile file!!
48- zfile = zipfile .ZipFile (str (fname ))
49- name = zfile .namelist ()[0 ]
50- cfile = zfile .open (name )
51- else :
52- msg = (
53- "Unrecognized file extension. "
54- f"Expected .gzip, .bz2, or .zip, got { extension } "
55- )
56- raise ValueError (
57- msg ,
58- )
59- contents = cfile .read ()
60- cfile .close ()
61- return contents
59+ with loader (str (fname )) as zfile :
60+ name = zfile .namelist ()[0 ]
61+ with zfile .open (name ) as cfile :
62+ return cfile .read ()
63+ with loader (str (fname )) as cfile :
64+ return cfile .read ()
6265
6366
6467def _read_file (fname : str | Path | StringIO ) -> StringIO :
0 commit comments