15
15
from os .path import splitext
16
16
from distutils .version import StrictVersion
17
17
18
+ from nibabel .optpkg import optional_package
19
+
18
20
# is indexed_gzip present and modern?
19
21
try :
20
22
import indexed_gzip as igzip
39
41
IndexedGzipFile = gzip .GzipFile
40
42
HAVE_INDEXED_GZIP = False
41
43
42
- # Enable .zst support if pyzstd installed.
43
- try :
44
- from pyzstd import ZstdFile
45
- HAVE_ZSTD = True
46
- except ImportError :
47
- HAVE_ZSTD = False
48
-
49
44
50
45
def _gzip_open (filename , mode = 'rb' , compresslevel = 9 , keep_open = False ):
51
46
@@ -62,6 +57,12 @@ def _gzip_open(filename, mode='rb', compresslevel=9, keep_open=False):
62
57
return gzip_file
63
58
64
59
60
+ def _zstd_open (filename , mode = "r" , * , level_or_option = None , zstd_dict = None ):
61
+ pyzstd = optional_package ("pyzstd" )[0 ]
62
+ return pyzstd .ZstdFile (filename , mode ,
63
+ level_or_option = level_or_option , zstd_dict = zstd_dict )
64
+
65
+
65
66
class Opener (object ):
66
67
r""" Class to accept, maybe open, and context-manage file-likes / filenames
67
68
@@ -84,14 +85,13 @@ class Opener(object):
84
85
"""
85
86
gz_def = (_gzip_open , ('mode' , 'compresslevel' , 'keep_open' ))
86
87
bz2_def = (BZ2File , ('mode' , 'buffering' , 'compresslevel' ))
88
+ zstd_def = (_zstd_open , ('mode' , 'level_or_option' , 'zstd_dict' ))
87
89
compress_ext_map = {
88
90
'.gz' : gz_def ,
89
91
'.bz2' : bz2_def ,
92
+ '.zst' : zstd_def ,
90
93
None : (open , ('mode' , 'buffering' )) # default
91
94
}
92
- if HAVE_ZSTD : # add zst to ext map, if library exists
93
- zstd_def = (ZstdFile , ('mode' , 'level_or_option' ))
94
- compress_ext_map ['.zst' ] = zstd_def
95
95
#: default compression level when writing gz and bz2 files
96
96
default_compresslevel = 1
97
97
#: default option for zst files
0 commit comments