Чтение данных 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()