Как использовать h5py для доступа к нескольким файлам HDF5, хранящимся на Google Team Drives?Данные в разных файлах выглядят одинаково в Python - PullRequest
0 голосов
/ 28 февраля 2019

Я пытаюсь использовать h5py для доступа (чтения / записи / копирования) к нескольким файлам HDF5, которые хранятся на Google Team Drive.Я использую Google File Stream, и мой Google Team Drive отображается в Проводнике как подключенный диск (G :).Кроме того, я выбрал опцию, чтобы сделать мои файлы доступными в автономном режиме.

Я могу читать и записывать отдельные файлы HDF5 на и с моего Google Team Drive, если у меня только один файл, открытый одновременно в h5py.Однако если в h5py одновременно открыто несколько файлов, то внутренняя структура (группы, наборы данных и данные) в каждом файле HDF5 (как считывается h5py) выглядит идентично первому открытому мной файлу.

Здесьэто пример, чтобы продемонстрировать мою проблему.Во-первых, давайте создадим два простых файла HDF5 на Google Team Drive:

from pathlib import Path
import h5py

# Set up path and filenames
folder = Path(r'G:\Team Drives\Shared Drive')
filename1 = folder / 'file1.h5'
filename2 = folder / 'file2.h5'

# Create first HDF5 file
h5file1 = h5py.File(filename1, 'a')
h5file1.create_dataset('data1', data=1)
h5file1.close()

# Create second HDF5 file
h5file2 = h5py.File(filename2, 'a')
h5file2.create_dataset('data2', data=2)
h5file2.close()

Затем давайте откроем файлы HDF5 по одному и напечатаем имена наборов данных в каждом файле:

h5file1 = h5py.File(filename1, 'r')
print(f'{h5file1}: datasets = {list(h5file1.keys())}')
h5file1.close()
h5file2 = h5py.File(filename2, 'r')
print(f'{h5file2}: datasets = {list(h5file2.keys())}')
h5file2.close()

Результат:

<HDF5 file "file1.h5" (mode r)>: datasets = ['data1']
<HDF5 file "file2.h5" (mode r)>: datasets = ['data2']

, что я и ожидал.Теперь давайте откроем оба файла HDF5 одновременно и снова напечатаем имена наборов данных в каждом файле:

h5file1 = h5py.File(filename1, 'r')
h5file2 = h5py.File(filename2, 'r')
print(f'{h5file1}: datasets = {list(h5file1.keys())}')
print(f'{h5file2}: datasets = {list(h5file2.keys())}')
h5file1.close()
h5file2.close()

Теперь результат:

<HDF5 file "file1.h5" (mode r)>: datasets = ['data1']
<HDF5 file "file2.h5" (mode r)>: datasets = ['data1']

Даже еслидескрипторы файлов указывают, что они указывают на разные имена файлов, h5py считывает внутреннюю структуру данных (группы, наборы данных и данные) обоих файлов как идентичные первому открытому файлу.

Хотя я могу открыть одинфайл за раз, если я читаю файлы, это становится проблемой, если я хочу скопировать набор данных из существующего файла в новый файл.Например, давайте попробуем скопировать набор данных «data1» из file1 в новый файл:

filename3 = folder / 'file3.h5'
h5file3 = h5py.File(filename3, 'a')
h5file1 = h5py.File(filename1, 'r')
h5file1.copy('data1', h5file3)

Это приведет к следующей ошибке:

KeyError: "Unable to open object (object 'data1' doesn't exist)"

, поскольку file1 был открыт после file3,и file3 не содержит набор данных «data1».Если я вместо этого открою file1 перед file3, то получу:

OSError: Unable to create file (file exists)

Единственный обходной путь, который я смог использовать до сих пор, - это сначала создать file3 на моем локальном диске (C :), скопировать набор данных изфайл1 в файл3, закройте оба файла, а затем переместите файл3 на Google Team Drive.

Я нашел эти сообщения на форуме ( Python HDF5 H5Py проблемы с открытием нескольких файлов и Озадаченное поведение назначенияс объектом h5py в качестве переменной экземпляра ), где обсуждалась аналогичная проблема, когда то же имя переменной Python было переназначено другой переменной экземпляра файла h5py.Тем не менее, я думаю, что моя проблема в другом, потому что я использую уникальные имена переменных, и ответ на один из вопросов заявил, что проблема может быть исправлена ​​с помощью h5py 2.0 или выше (я использую h5py 2.9.0).

Я также прочитал сообщение в блоге HDF в облаке , в котором говорится, что существуют проблемы с доступом к файлам HDF5 в облаке, если вы не можете убедить свою операционную систему в том, что облаконормальная файловая система.Однако я подумал, что с помощью Google File Stream это можно сделать, поскольку он монтируется как мой диск G:

Не понимаю ли я что-то о h5py или о том, как смонтирован мой Google Team Drive?Могу ли я использовать h5py для доступа к нескольким файлам HDF5 на Google Team Drive?

Примечание. Я использую Python 3.7 и h5py 2.9.0 на 64-разрядной машине с Windows 10.

...