Для чтения .nc
файлов Iris внутренне использует ту же самую netcdf4-python
библиотеку, которую вы упомянули.
Это означает, что теоретически вы можете:
Подкласс CFReader , переопределяющий его __init__
метод с единственным изменением в строке self._dataset = netCDF4.Dataset(self._filename, mode='r')
Либо напишите свою собственную функцию load_cube
( на основе этого кода ), которая будет использовать ваш пользовательский CFReader, либо вы можете сделать monkeypatch iris
с вашим настроенным CFReader.
Общая идея для исправления обезьян:
from urllib.request import urlopen
import iris.fileformats.cf
import netCDF4 as nc
def __patch_CFReader():
if getattr(iris.fileformats.cf.CFReader, '_HACKY_PATCHED'):
return
from iris.fileformats.cf import CFReader
class CustomCFReader(CFReader):
_HACKY_PATCHED = True
def __init__(self, uri, *args, **kwargs):
# ... other code copied
with urlopen(url) as stream:
self._dataset = nc.Dataset('HadCRUT', memory=stream.read())
# ... other code copied
iris.fileformats.cf.CFReader = CustomCFReader
__patch_CFReader()
import iris
cube = iris.load_cube('https://crudata.uea.ac.uk/cru/data/temperature/HadCRUT.4.6.0.0.median.nc')
ВНИМАНИЕ! В зависимости от того, как выполняется импорт в вашем проекте, исправление обезьян может
не всегда работает, как вы сначала думаете. Так что, возможно, вам лучше использовать библиотеку
специально разработанный для мартышек, например Горилла:
https://gorilla.readthedocs.io/en/latest/tutorial.html
# my_patches.py:
from urllib.request import urlopen
import gorilla
import iris.fileformats.cf
import netCDF4 as nc
settings = gorilla.Settings(allow_hit=True)
@gorilla.patch(iris.fileformats.cf.CFReader, settings=settings)
def __init__(self, uri, *args, **kwargs):
# ... other code copied
with urlopen(url) as stream:
self._dataset = nc.Dataset('HadCRUT', memory=stream.read())
# ... other code copied
# earliest_imported_module.py:
import gorilla
import my_patches
for patch in gorilla.find_patches([my_patches]):
gorilla.apply(patch)