
    dO                    *   d dl mZ d dlZd dlZd dlZd dlmZ d dlmZ d dl	m
Z
mZ d dlZd dlmZ d dlmZmZmZmZmZmZmZ d dlmZmZ d d	lmZmZmZmZm Z  d d
l!m"Z"m#Z# d dl$m%Z% d dl&m'Z' d dl(m)Z) d dl*m+Z+m,Z,m-Z-m.Z. d dl/m0Z0 e
rd dl1m2Z2 d dlm3Z3 d dl4m5Z5 dddddZ6 eeeg          Z7 G d de          Z8 G d de8          Z9d Z:d Z;d.dZ<d  Z=d! Z>e>fd"Z?d# Z@d$ ZA	 	 	 	 	 d/d'ZBd( ZC G d) d*e          ZD G d+ d,e          ZEd&eEfed-<   dS )0    )annotationsN)Iterable)suppress)TYPE_CHECKINGAny)coding)BACKEND_ENTRYPOINTSBackendArrayBackendEntrypointWritableCFDataStore_normalize_pathfind_root_and_grouprobust_getitem)CachingFileManagerDummyFileManager)	HDF5_LOCKNETCDFC_LOCKcombine_locksensure_lockget_write_lock)encode_nc3_attr_valueencode_nc3_variable)StoreBackendEntrypoint)pop_to)indexing)
FrozenDictclose_on_erroris_remote_uritry_read_magic_number_from_path)Variable)BufferedIOBase)AbstractDataStore)Datasetnativebiglittle)=><|c                  &    e Zd ZdZd Zd ZddZdS )BaseNetCDF4Array)	datastoredtypeshapevariable_namec                    || _         || _        |                                 }|j        | _        |j        }|t
          u r$t          j                            t
                    }|| _        d S N)	r-   r0   	get_arrayr/   r.   strr   stringscreate_vlen_dtype)selfr0   r-   arrayr.   s        8lib/python3.11/site-packages/xarray/backends/netCDF4_.py__init__zBaseNetCDF4Array.__init__;   s[    "*  [
C<< N44S99E


    c                    | j         j        5  |                     d          }|||<   | j         j        r| j                             d           d d d            d S # 1 swxY w Y   d S )NF
needs_lock)r-   lockr3   	autocloseclose)r7   keyvaluedatas       r9   __setitem__zBaseNetCDF4Array.__setitem__L   s    ^  	7 	7>>U>33DDI~' 7$$$666		7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7s   AAA!$A!Tc                     t          d          )NzVirtual Method)NotImplementedError)r7   r>   s     r9   r3   zBaseNetCDF4Array.get_arrayS   s    !"2333r;   NT)__name__
__module____qualname__	__slots__r:   rE   r3    r;   r9   r,   r,   8   sK        @I  "7 7 74 4 4 4 4 4r;   r,   c                  &    e Zd ZdZddZd Zd ZdS )NetCDF4ArrayWrapperrM   Tc                
   | j                             |          }|j        | j                 }|                    d           t          t                    5  |                    d           d d d            n# 1 swxY w Y   |S )NF)r-   _acquire	variablesr0   set_auto_maskandscaler   AttributeErrorset_auto_chartostring)r7   r>   dsvariables       r9   r3   zNetCDF4ArrayWrapper.get_arrayZ   s    ^$$Z00< 23&&u---n%% 	2 	2**5111	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2s   A88A<?A<c                b    t          j        || j        t           j        j        | j                  S r2   )r   explicit_indexing_adapterr/   IndexingSupportOUTER_getitem)r7   rB   s     r9   __getitem__zNetCDF4ArrayWrapper.__getitem__c   s*    1X5;T]
 
 	
r;   c                F   | j         j        r!t          j        t          t
                    }nt          j        }	 | j         j        5  | 	                    d          } |||          }d d d            n# 1 swxY w Y   n# t          $ r d}t          |          w xY w|S )N)catchFr=   zThe indexing operation you are attempting to perform is not valid on netCDF4.Variable object. Try loading your data into memory first by calling .load().)r-   	is_remote	functoolspartialr   RuntimeErroroperatorgetitemr?   r3   
IndexError)r7   rB   re   original_arrayr8   msgs         r9   r\   zNetCDF4ArrayWrapper._getitemh   s    ># 	''lKKKGG&G	"$ 5 5!%5!A!A445 5 5 5 5 5 5 5 5 5 5 5 5 5 5  		" 		" 		"
B 
 S//!		" s/   B #A6*B 6A::B =A:>B BNrH   )rI   rJ   rK   rL   r3   r]   r\   rM   r;   r9   rO   rO   W   sK        I   
 
 

    r;   rO   c                    t           j                            d          t           j                                        fD ]}|                    |           } | S )NT)allows_unicode)r   r5   EncodedStringCoderCharacterArrayCoderencode)varcoders     r9   _encode_nc4_variablerp      sT    )))>>**,,     ll3Jr;   c                >    | t           urt          d| d          d S )Nzunexpected dtype encoding zM. This shouldn't happen: please file a bug report at github.com/pydata/xarray)r4   AssertionError)r.   s    r9   $_check_encoding_dtype_is_vlen_stringrs      s=    C< < < <
 
 	
 r;   NETCDF4Fc                    |dk    rt          |           S d| j        v r-| j        d         }t          |           |rt          d          | j        S )Nrt   r.   zLencoding dtype=str for vlen strings is only supported with format='NETCDF4'.)
_nc4_dtypeencodingrs   
ValueErrorr.   )rn   	nc_formatraise_on_invalid_encodingencoded_dtypes       r9   _get_datatyper|      si    I##,W-,];;;$ 	)   9r;   c                   d| j         v r*| j                             d          }t          |           nYt          j                            | j                  rt          }n-| j        j        dv r| j        }nt          d| j                   |S )Nr.   )iufcSz(unsupported dtype for netCDF4 variable: )
rw   poprs   r   r5   is_unicode_dtyper.   r4   kindrx   )rn   r.   s     r9   rv   rv      s    #,  )),U3333		(	(	3	3 Q	4	4	4	OCIOOPPPLr;   c                ,    |                      |          S r2   )createGroup)datasetnames     r9   _netcdf4_create_groupr      s    t$$$r;   c                J   |dv r| S t          |t                    st          d          |                    d                              d          }|D ]M}	 | j        |         } # t          $ r0}|dk    r || |          } nt          d| |          Y d }~Fd }~ww xY w| S )N>   N /zgroup must be a string or Noner   rzgroup not found: )
isinstancer4   rx   stripsplitgroupsKeyErrorOSError)rV   groupmodecreate_grouppathrB   es          r9   _nc4_require_groupr      s    	 %%% 	?=>>>{{3%%c** 	@ 	@C@Ys^ @ @ @3;;%b#..BB "";c";";Q??? BBBB@ 	s   A&&
B 0&BB c                p    | j         j        dk    r#d|v r!t          j        |d                   |d<   d S d S d S )Nr   
_FillValue)r.   r   npstring_)rD   
attributess     r9   _ensure_fill_value_validr      sJ     z#,*"<"<#%:j.F#G#G
<    "<"<r;   c                Z   | j         j        dvrn| j                            | j                             d                    }t          | j        || j        | j                  } | j        	                    dd            | j        
                    dd          dk    rt          d          | S )N)r'   r*   r'   endianr$   z]Attempt to write non-native endian type, this is not supported by the netCDF4 python library.)r.   	byteorderrD   astypenewbyteorderr    dimsattrsrw   r   getrG   )rn   rD   s     r9   _force_native_endiannessr      s     y*,,xsy55c::;;sxsy#,??4(((
|(++x77!
 
 	

 Jr;   TnetCDF4c                   d| j                                         }ddh}h d|r                    d           |r                    d           |s||                    d          g|d         }t	          fdt          || j        | j                  D                       }	d|v }
|
o|                    d          | j        k    }|	s|r|d= t	          fd	| j        D                       }|s|rd
|                                v r|d
= |D ]	}||v r||= 
|r)fd|D             }|rt          d|d|d          nt          |          D ]	}|vr||= 
|S )NrM   sourceoriginal_shape>	   zlibr.   shuffle	complevelr   
chunksizes
contiguous
fletcher32compressionleast_significant_digitcompression_optsr   c              3  4   K   | ]\  }}}||k    o|vV  d S r2   rM   ).0r   ddimunlimited_dimss       r9   	<genexpr>z1_extract_nc4_variable_encoding.<locals>.<genexpr>  sK       
 
1c E/c/
 
 
 
 
 
r;   c              3      K   | ]}|v V  	d S r2   rM   )r   r   r   s     r9   r   z1_extract_nc4_variable_encoding.<locals>.<genexpr>  s(      KKcC>1KKKKKKr;   r   c                    g | ]}|v|	S rM   rM   )r   kvalid_encodingss     r9   
<listcomp>z2_extract_nc4_variable_encoding.<locals>.<listcomp>  s#    CCC!?*B*B1*B*B*Br;   z#unexpected encoding parameters for z
 backend: z. Valid encodings are: )rw   copyaddr   anyzipr/   r   keysrx   list)rW   raise_on_invalidlsd_okay	h5py_okaybackendr   rw   safe_to_dropr   chunks_too_bighas_original_shapechanged_shapevar_has_unlim_dimr   invalidr   s        `         @r9   _extract_nc4_variable_encodingr      s6     %%''H./L
 
 
O  75666 0./// '\ : : F l+
 
 
 
 
 X^X]KK
 
 
 
 
 .9S8<<0@#A#AX^#S 	  	'] 	'&KKKKX]KKKKK # 1 #lhmmoo6U6U\"  == 
 CCCChCCC 	6g 6 67 6 6"16 6  	 h 	  	 A''QKOr;   c                \    t          j        |           }|j        j        dv o
|j        dk    S )N)Ur      )r   asarrayr.   r   size)rC   arrs     r9   _is_list_of_stringsr   (  s+    
*U

C9>Z'8CHqL8r;   c                      e Zd ZdZdZddedfdZe	 	 	 	 	 	 	 	 	 dd	            Zdd
Z	e
d             Zd Zd Zd Zd Zd ZddZd Zd Z	 ddZd Zd ZdS )NetCDF4DataStorezStore for reading and writing data via the Python-NetCDF4 library.

    This store supports NetCDF3, NetCDF4 and OpenDAP datasets.
    )r@   formatr`   r?   	_filename_group_manager_modeNFc                   dd l }t          ||j                  rK|t          |          \  }}n't	          |          |j        urt          d          |}t          |          }|| _        || _        || _	        | j
        j        | _        | j
                                        | _        t          | j                  | _        t#          |          | _        || _        d S )Nr   zDmust supply a root netCDF4.Dataset if the group argument is provided)r   r   r#   r   typerx   r   r   r   r   rV   
data_modelr   filepathr   r   r`   r   r?   r@   )r7   managerr   r   r?   r@   r   roots           r9   r:   zNetCDF4DataStore.__init__>  s     	gw// 
	-}1'::ee==77$/   &t,,G
g())++&t~66%%	"r;   r   rt   Tc                   dd l }t          |t          j                  rt          j        |          }t          |t
                    st          d          |d}|i|dk    rt          |          rt          }nLt          }nD||
                    d          rt          }nt          }t          |t          |          g          }t          ||||          }t          |j        |||          } | |||||
          S )Nr   zJcan only read bytes or file-like objects with engine='scipy' or 'h5netcdf'rt   r   )clobberdisklesspersistr   )r   kwargs)r   r   r?   r@   )r   r   osPathLikefspathr4   rx   r   r   NETCDF4_PYTHON_LOCK
startswithr   r   dictr   r#   )clsfilenamer   r   r   r   r   r   r?   
lock_makerr@   r   	base_lockr   r   s                  r9   openzNetCDF4DataStore.openX  s)    	h,, 	+y**H(C(( 	4  
 >F<s{{ ** /'DD.DD>V%6%6y%A%A> 3II ,I$i1I1I%JKKh
 
 
 %OXD
 
 
 s7%dSSSSr;   c                    | j                             |          5 }t          || j        | j                  }d d d            n# 1 swxY w Y   |S r2   )r   acquire_contextr   r   r   )r7   r>   r   rV   s       r9   rQ   zNetCDF4DataStore._acquire  s    ]**:66 	C$#D$+tzBBB	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C	s   AA
Ac                *    |                                  S r2   )rQ   r7   s    r9   rV   zNetCDF4DataStore.ds  s    }}r;   c                   j         }t          j        t          ||                     }fd                                D             }t          ||           i }                                }||                    |                                           }|(|dk    rd|d<   d |d<   nd|d<   t          |          |d<   t          ||d           | j        |d<   j        |d<   j        |d	<   t          ||||          S )
Nc                <    i | ]}|                     |          S rM   )	getncattr)r   r   rn   s     r9   
<dictcomp>z8NetCDF4DataStore.open_store_variable.<locals>.<dictcomp>  s'    AAAaaq))AAAr;   r   Tr   Fr   r   r   r.   )
dimensionsr   LazilyIndexedArrayrO   ncattrsr   filtersupdatechunkingtupler   r   r/   r.   r    )	r7   r   rn   r   rD   r   rw   r  r  s	     `      r9   open_store_variablez$NetCDF4DataStore.open_store_variable  s   ^
*+>tT+J+JKKAAAA3;;==AAA
 z222++--OOG$$$<<>><'')-&)-&&).&).x& 	z8%>???!^%(Y!"I
D*h???r;   c                r     t           fd j        j                                        D                       S )Nc              3  N   K   | ]\  }}|                     ||          fV   d S r2   )r  )r   r   vr7   s      r9   r   z1NetCDF4DataStore.get_variables.<locals>.<genexpr>  sM       
 
48AqQ((A../
 
 
 
 
 
r;   )r   rV   rR   itemsr   s   `r9   get_variableszNetCDF4DataStore.get_variables  sL     
 
 
 
<@G<M<S<S<U<U
 
 
 
 
 	
r;   c                h     t           fd j                                        D                       S )Nc              3  P   K   | ] }|j                             |          fV  !d S r2   )rV   r   )r   r   r7   s     r9   r   z-NetCDF4DataStore.get_attrs.<locals>.<genexpr>  s8      OO1dg//223OOOOOOr;   )r   rV   r  r   s   `r9   	get_attrszNetCDF4DataStore.get_attrs  s2    OOOOTW__=N=NOOOOOOr;   c                l    t          d | j        j                                        D                       S )Nc              3  >   K   | ]\  }}|t          |          fV  d S r2   )lenr   r   r	  s      r9   r   z2NetCDF4DataStore.get_dimensions.<locals>.<genexpr>  s0      MM$!Q1c!ff+MMMMMMr;   )r   rV   r   r
  r   s    r9   get_dimensionszNetCDF4DataStore.get_dimensions  s0    MM$'2D2J2J2L2LMMMMMMr;   c                V    dd | j         j                                        D             iS )Nr   c                @    h | ]\  }}|                                 |S rM   )isunlimitedr  s      r9   	<setcomp>z0NetCDF4DataStore.get_encoding.<locals>.<setcomp>  s9       aAMMOO  r;   )rV   r   r
  r   s    r9   get_encodingzNetCDF4DataStore.get_encoding  s<      "g06688  
 	
r;   c                J    |s|nd }| j                             ||           d S )N)r   )rV   createDimension)r7   r   lengthis_unlimited
dim_lengths        r9   set_dimensionzNetCDF4DataStore.set_dimension  s1    #/9VVT
:66666r;   c                    | j         dk    rt          |          }t          |          r| j                            ||           d S | j                            ||           d S Nrt   )r   r   r   rV   setncattr_string	setncattr)r7   rB   rC   s      r9   set_attributezNetCDF4DataStore.set_attribute  sh    ;)##)%00Eu%% 	*G$$S%00000Gc5)))))r;   c                x    t          |          }| j        dk    rt          |          }nt          |          }|S r   )r   r   rp   r   )r7   rW   s     r9   encode_variablez NetCDF4DataStore.encode_variable  s=    +H55;)##+H55HH*844Hr;   c                   t          || j        |          }|j                                        }|                    dd           }|t
          u r|t          d|d          t          |||          }|| j        j	        v r| j        j	        |         }	n| j        
                    |||j        |                    dd          |                    dd	          |                    d
d          |                    dd          |                    dd          |                    d          d|                    d          |          }	|	                    |           t          ||           }
|
|j        fS )N)rz   r   znetCDF4 does not yet support setting a fill value for variable-length strings (https://github.com/Unidata/netcdf4-python/issues/730). Either remove '_FillValue' from encoding on variable zH or set {'dtype': 'S1'} in encoding to use the fixed width NC_CHAR type.)r   r   r   Fr      r   Tr   r   r   r$   r   )varnamedatatyper   r   r   r   r   r   r   r   r   
fill_value)r|   r   r   r   r   r4   rG   r   rV   rR   createVariabler   r   	setncattsrO   rD   )r7   r   rW   check_encodingr   r)  r   r*  rw   nc4_vartargets              r9   prepare_variablez!NetCDF4DataStore.prepare_variable  s    !dk^
 
 
 ##%%YY|T22
s??z5%  IM        2~n
 
 
 47$$$g'-GGg,,!#=\\&%00",,{A66 Y55#<<e<<#<<e<<#<<55(05N(O(O% -  G 	%   $T400x}$$r;   c                8    | j                                          d S r2   )rV   syncr   s    r9   r2  zNetCDF4DataStore.sync  s    r;   c                *     | j         j        di | d S )NrM   )r   rA   )r7   r   s     r9   rA   zNetCDF4DataStore.close	  s#    %%f%%%%%r;   )	r   rt   NTFFNNFrH   )F)FN)rI   rJ   rK   __doc__rL   r   r:   classmethodr   rQ   propertyrV   r  r  r  r  r  r  r#  r%  r0  r2  rA   rM   r;   r9   r   r   -  sw        
	I "3FRW# # # #4  .T .T .T [.T`   
   X@ @ @:
 
 

P P PN N N
 
 
7 7 7 7* * *   DH.% .% .% .%`  & & & & &r;   r   c                  L    e Zd ZdZdZdZddZd	d	d	d	d
d
d
d
ddd	ddd
ddddZd
S )NetCDF4BackendEntrypointa  
    Backend for netCDF files based on the netCDF4 package.

    It can open ".nc", ".nc4", ".cdf" files and will be choosen
    as default for these files.

    Additionally it can open valid HDF5 files, see
    https://h5netcdf.org/#invalid-netcdf-files for more info.
    It will not be detected as valid backend for such files, so make
    sure to specify ``engine="netcdf4"`` in ``open_dataset``.

    For more information about the underlying library, visit:
    https://unidata.github.io/netcdf4-python

    See Also
    --------
    backends.NetCDF4DataStore
    backends.H5netcdfBackendEntrypoint
    backends.ScipyBackendEntrypoint
    zLOpen netCDF (.nc, .nc4 and .cdf) and most HDF5 files using netCDF4 in XarrayzYhttps://docs.xarray.dev/en/stable/generated/xarray.backends.NetCDF4BackendEntrypoint.htmlfilename_or_obj;str | os.PathLike[Any] | BufferedIOBase | AbstractDataStorereturnboolc                ,   t          |t                    rt          |          rdS t          |          }||                    d          S t          |t          t
          j        f          r&t
          j                            |          \  }}|dv S dS )NT)s   CDFs   HDF

>   .nc.cdf.nc4F)	r   r4   r   r   r   r   r   r   splitext)r7   r9  magic_number_exts        r9   guess_can_openz'NetCDF4BackendEntrypoint.guess_can_open(  s     os++ 	o0N0N 	46GG#**+IJJJoR['9:: 	2W%%o66FAs111ur;   TNr   rt   F)mask_and_scaledecode_timesconcat_charactersdecode_coordsdrop_variables
use_cftimedecode_timedeltar   r   r   r   r   r   r?   r@   rJ  str | Iterable[str] | Noner#   c                  t          |          }t                              ||
||	|||||	  	        }t                      }t	          |          5  |                    ||||||||          }d d d            n# 1 swxY w Y   |S )N)r   r   r   r   r   r   r?   r@   )rF  rG  rH  rI  rJ  rK  rL  )r   r   r   r   r   open_dataset)r7   r9  rF  rG  rH  rI  rJ  rK  rL  r   r   r   r   r   r   r?   r@   storestore_entrypointrV   s                       r9   rO  z%NetCDF4BackendEntrypoint.open_dataset9  s    ( */:: %% & 

 

 233E"" 
	 
	!..-)"3+-%!1 / 	 	B
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 	s   A::A>A>)r9  r:  r;  r<  )r9  r:  rJ  rM  r;  r#   )rI   rJ   rK   r4  descriptionurlrE  rO  rM   r;   r9   r8  r8    s         , 	W  fC   * 59%- - - - - - - -r;   r8  netcdf4)rt   F)FTFr   N)F
__future__r   ra   rd   r   collections.abcr   
contextlibr   typingr   r   numpyr   xarrayr   xarray.backends.commonr	   r
   r   r   r   r   r   xarray.backends.file_managerr   r   xarray.backends.locksr   r   r   r   r   xarray.backends.netcdf3r   r   xarray.backends.storer   xarray.coding.variablesr   xarray.corer   xarray.core.utilsr   r   r   r   xarray.core.variabler    ior!   r"   xarray.core.datasetr#   _endian_lookupr   r,   rO   rp   rs   r|   rv   r   r   r   r   r   r   r   r8  rM   r;   r9   <module>rg     s   " " " " " "      				 $ $ $ $ $ $       % % % % % % % %                            N M M M M M M M              O N N N N N N N 8 8 8 8 8 8 * * * * * *                        * ) ) ) ) ) ,!!!!!!888888++++++  e(JJ $m\9$=>> 4 4 4 4 4| 4 4 4>% % % % %* % % %P  
 
 
   
 
 
% % % 6K    ,H H H  2 B B B BJ9 9 9
]& ]& ]& ]& ]&* ]& ]& ]&@Y Y Y Y Y0 Y Y Yx #,-E!F I   r;   