3939 IndexedGzipFile = gzip .GzipFile
4040 HAVE_INDEXED_GZIP = False
4141
42+ # Enable .zst support if pyzstd installed.
43+ try :
44+ from pyzstd import ZstdFile
45+ except ImportError :
46+ pass
4247
4348def _gzip_open (filename , mode = 'rb' , compresslevel = 9 , keep_open = False ):
4449
@@ -77,13 +82,19 @@ class Opener(object):
7782 """
7883 gz_def = (_gzip_open , ('mode' , 'compresslevel' , 'keep_open' ))
7984 bz2_def = (BZ2File , ('mode' , 'buffering' , 'compresslevel' ))
85+ zstd_def = (ZstdFile , ('mode' , 'level_or_option' ))
8086 compress_ext_map = {
8187 '.gz' : gz_def ,
8288 '.bz2' : bz2_def ,
89+ '.zst' : zstd_def ,
8390 None : (open , ('mode' , 'buffering' )) # default
8491 }
8592 #: default compression level when writing gz and bz2 files
8693 default_compresslevel = 1
94+ #: default option for zst files
95+ default_zst_compresslevel = 3
96+ default_level_or_option = {"rb" : None , "r" : None ,
97+ "wb" : default_zst_compresslevel , "w" : default_zst_compresslevel }
8798 #: whether to ignore case looking for compression extensions
8899 compress_ext_icase = True
89100
@@ -100,10 +111,15 @@ def __init__(self, fileish, *args, **kwargs):
100111 full_kwargs .update (dict (zip (arg_names [:n_args ], args )))
101112 # Set default mode
102113 if 'mode' not in full_kwargs :
103- kwargs ['mode' ] = 'rb'
114+ mode = 'rb'
115+ kwargs ['mode' ] = mode
116+ else :
117+ mode = full_kwargs ['mode' ]
104118 # Default compression level
105119 if 'compresslevel' in arg_names and 'compresslevel' not in kwargs :
106120 kwargs ['compresslevel' ] = self .default_compresslevel
121+ if 'level_or_option' in arg_names and 'level_or_option' not in kwargs :
122+ kwargs ['level_or_option' ] = self .default_level_or_option [mode ]
107123 # Default keep_open hint
108124 if 'keep_open' in arg_names :
109125 kwargs .setdefault ('keep_open' , False )
0 commit comments