diff --git a/xarray/backends/netCDF4_.py b/xarray/backends/netCDF4_.py index a23d247b6c3..aaf1f668037 100644 --- a/xarray/backends/netCDF4_.py +++ b/xarray/backends/netCDF4_.py @@ -3,6 +3,7 @@ import functools import operator import os +import sys from collections.abc import Iterable from contextlib import suppress from typing import TYPE_CHECKING, Any @@ -371,7 +372,13 @@ class NetCDF4DataStore(WritableCFDataStore): ) def __init__( - self, manager, group=None, mode=None, lock=NETCDF4_PYTHON_LOCK, autoclose=False + self, + manager, + group=None, + mode=None, + lock=NETCDF4_PYTHON_LOCK, + autoclose=False, + encoding=None, ): import netCDF4 @@ -391,7 +398,7 @@ def __init__( self._group = group self._mode = mode self.format = self.ds.data_model - self._filename = self.ds.filepath() + self._filename = self.ds.filepath(encoding=encoding) self.is_remote = is_remote_uri(self._filename) self.lock = ensure_lock(lock) self.autoclose = autoclose @@ -410,6 +417,7 @@ def open( lock=None, lock_maker=None, autoclose=False, + encoding=None, ): import netCDF4 @@ -422,6 +430,9 @@ def open( "with engine='scipy' or 'h5netcdf'" ) + if encoding is None: + encoding = sys.getfilesystemencoding() + if format is None: format = "NETCDF4" @@ -443,13 +454,21 @@ def open( diskless=diskless, persist=persist, format=format, + encoding=encoding, ) if auto_complex is not None: kwargs["auto_complex"] = auto_complex manager = CachingFileManager( netCDF4.Dataset, filename, mode=mode, kwargs=kwargs ) - return cls(manager, group=group, mode=mode, lock=lock, autoclose=autoclose) + return cls( + manager, + group=group, + mode=mode, + lock=lock, + autoclose=autoclose, + encoding=encoding, + ) def _acquire(self, needs_lock=True): with self._manager.acquire_context(needs_lock) as root: @@ -661,6 +680,7 @@ def open_dataset( auto_complex=None, lock=None, autoclose=False, + encoding=None, ) -> Dataset: filename_or_obj = _normalize_path(filename_or_obj) store = NetCDF4DataStore.open( @@ -674,6 +694,7 @@ def open_dataset( auto_complex=auto_complex, lock=lock, autoclose=autoclose, + encoding=encoding, ) store_entrypoint = StoreBackendEntrypoint()