From 1af010428b5486c353f3dccda626e0c6d38b433c Mon Sep 17 00:00:00 2001 From: wqshen Date: Thu, 29 May 2025 14:04:36 +0800 Subject: [PATCH 1/2] add **encoding** argument in open_dataset to support reading Netcdf file with non-ASCII path or filename and keep consistent behavior with upstream netcdf4 library --- xarray/backends/netCDF4_.py | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/xarray/backends/netCDF4_.py b/xarray/backends/netCDF4_.py index a23d247b6c3..f8caa763799 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,7 @@ 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 +392,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 +411,7 @@ def open( lock=None, lock_maker=None, autoclose=False, + encoding=None, ): import netCDF4 @@ -421,6 +423,9 @@ def open( "can only read bytes or file-like objects " "with engine='scipy' or 'h5netcdf'" ) + + if encoding is None: + encoding = sys.getfilesystemencoding() if format is None: format = "NETCDF4" @@ -443,13 +448,14 @@ 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 +667,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 +681,7 @@ def open_dataset( auto_complex=auto_complex, lock=lock, autoclose=autoclose, + encoding=encoding, ) store_entrypoint = StoreBackendEntrypoint() From 7e4543c4f3ed0dedb34e8f366304f765a5176b65 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 29 May 2025 06:22:16 +0000 Subject: [PATCH 2/2] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- xarray/backends/netCDF4_.py | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/xarray/backends/netCDF4_.py b/xarray/backends/netCDF4_.py index f8caa763799..aaf1f668037 100644 --- a/xarray/backends/netCDF4_.py +++ b/xarray/backends/netCDF4_.py @@ -372,7 +372,13 @@ class NetCDF4DataStore(WritableCFDataStore): ) def __init__( - self, manager, group=None, mode=None, lock=NETCDF4_PYTHON_LOCK, autoclose=False, encoding=None + self, + manager, + group=None, + mode=None, + lock=NETCDF4_PYTHON_LOCK, + autoclose=False, + encoding=None, ): import netCDF4 @@ -423,7 +429,7 @@ def open( "can only read bytes or file-like objects " "with engine='scipy' or 'h5netcdf'" ) - + if encoding is None: encoding = sys.getfilesystemencoding() @@ -455,7 +461,14 @@ def open( manager = CachingFileManager( netCDF4.Dataset, filename, mode=mode, kwargs=kwargs ) - return cls(manager, group=group, mode=mode, lock=lock, autoclose=autoclose, encoding=encoding) + 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: