Чтение данных xarray go16 напрямую с S3 без загрузки в систему

Чтение данных xarray идет16 напрямую с S3 без загрузки в систему. проблема в том, что я не могу объединить S3Files. Я вспоминаю 24 файла с S3 и хочу прочитать и извлечь данные для этих файлов за временной диапазон:

Это код:

      import datetime as dt
import xarray as xr
import fsspec
import s3fs

fs = fsspec.filesystem('s3', anon=True)

urls1=[]

for i in range (2):
    urls = [
        's3://' + f
        for f in fs.glob(f"s3://noaa-goes16/ABI-L2ACMC/2022/001/{i:02}/*.nc")
    ]
    urls1 = urls1+ urls

with fs.open(urls1[0]) as fileObj:
    ds = xr.open_dataset(fileObj, engine='h5netcdf')

однако я столкнулся с проблемойI/O operation on closed file.

1 ответ

Подобно большинству интерфейсов файловых объектов в python, открытие файлового объекта с помощью контекстного менеджера закрывает файл при выходе. Итак, в следующем примере:

      # use fs.open to create an S3File object
with fs.open(urls1[0], mode="rb") as fileObj:
    # open the netcdf for reading, but don't load the data - instead, just
    # establish a lazy-load connection to the underlying S3File object
    ds = xr.open_dataset(fileObj, engine='h5netcdf')

# <--
# exit the context, thereby closing the S3File object

# attempt to access the data again, after the stream is closed
ds.load()  # raises IOError

Вместо этого вы должны либо загрузить все данные в менеджере контекста:

      with fs.open(urls1[0], mode="rb") as fileObj:
    with xr.open_dataset(fileObj, engine='h5netcdf') as ds:
        ds = ds.load()

Или, если вы планируете использовать набор данных в более позднем коде без загрузки:

      fileObj = fs.open(urls1[0], mode="rb")
ds = xr.open_dataset(fileObj, engine='h5netcdf')

# other data operations

# be sure to close the connections when you're done
ds.close()
fileObj.close()
Другие вопросы по тегам