2016-08-10 3 views
1

Я пытаюсь читать в hdf-файле, но группы не отображаются. Я пробовал несколько разных методов, используя таблицы и h5py, но не работаю в отображении групп в файле. Я проверил, и файл «Данные иерархического формата данных (версия 5)» (см. «Обновление»). Информация о файле - here для справки.Данные в файле HDF с использованием Python отсутствуют

Пример данные могут быть найдены here

import h5py 
import tables as tb 

hdffile = "TRMM_LIS_SC.04.1_2010.260.73132" 

Использование h5py:

f = h5py.File(hdffile,'w') 
print(f) 

Выходы:

< HDF5 file "TRMM_LIS_SC.04.1_2010.260.73132" (mode r+) > 
[] 

Используя вкладку ле:

fi=tb.openFile(hdffile,'r') 
print(fi) 

Выходы:

TRMM_LIS_SC.04.1_2010.260.73132 (File) '' 
Last modif.: 'Wed Aug 10 18:41:44 2016' 
Object Tree: 
/(RootGroup) '' 

Closing remaining open files:TRMM_LIS_SC.04.1_2010.260.73132...done 

UPDATE

h5py.File(hdffile,'w') overwrote the file and emptied it. 

Теперь мой вопрос заключается в том, чтобы читать в HDF версии 4 файла в Python, так как h5py и таблицы оба не работают?

+0

Что говорит @MaxU ... И это также поможет вам: https: // docs.python.org/3/library/functions.html#open См. таблицу, чтобы прочитать файл «r», чтобы написать «w», чтобы добавить «a». Удачи! – Kartik

ответ

4

Какой размер файла? Я думаю, что выполнение h5py.File(hdffile,'w') перезаписывает его, поэтому он пуст. Используйте h5py.File(hdffile,'r') для чтения.

У меня недостаточно кармы, чтобы ответить на ответ @Luke H, но чтение его в пандах может быть не очень хорошей идеей. Pandas hdf5 использует pytables, который является «упрямым» способом использования hdf5. Это означает, что в нем хранятся дополнительные метаданные (например, индекс). Поэтому я бы использовал только pytables для чтения файла, если он был создан с помощью pytables.

+0

Спасибо! Вы правы, что «w» опустошил файл и вызвал файл hdf (версия 5), потому что я повторно загрузил файл, и он теперь находится в версии 4. К сожалению, теперь h5py.File не будет работать, потому что подпись файла не найдена. – BenT

0

попробуйте использовать панду:

import pandas as pd 
f = pd.read_hdf(C:/path/to/file) 

See Pandas HDF documentation here.

Это должен прочитать в любом HDF файл как dataframe то вы можете манипулировать.

+0

Я пытался использовать pd.read_hdf из pandas, но для этого требуется второй аргумент для идентификатора группы, который я не смог найти. – BenT

+0

Это потому, что в файле содержится более одного «объекта панды». Вам нужно указать, какой из них (VIA «аргумент ключа»). Прости, что не могу больше тебе помочь. –

+0

Итак, из @ user357269 я узнал, что файл получил перезапись и находится в hdf версии 4, а pandas.read_hdf работает только с того, что я собираю с версией 5. – BenT

1

UPDATE:

я бы порекомендовал вам сначала convert вашей HDF версии 4 файлы hdf5/h5 файлов, как и все современные библиотеки/модули работают с HDF версии 5 ...

OLD ответ:

попробовать это так:

store = pd.HDFStore(filename) 
print(store) 

это должно печатать подробности о файле HDF, включая сохраненные ключи, длины сохраненных DF и т. Д.

Демо:

In [18]: fn = r'C:\Temp\a.h5' 

In [19]: store = pd.HDFStore(fn) 

In [20]: print(store) 
<class 'pandas.io.pytables.HDFStore'> 
File path: C:\Temp\a.h5 
/df_dc    frame_table (typ->appendable,nrows->10,ncols->3,indexers->[index],dc->[a,b,c]) 
/df_no_dc   frame_table (typ->appendable,nrows->10,ncols->3,indexers->[index]) 

теперь вы можете читать dataframes с помощью клавиш из вышеприведенного вывода:

In [21]: df = store.select('df_dc') 

In [22]: df 
Out[22]: 
    a b c 
0 92 80 86 
1 27 49 62 
2 55 64 60 
3 31 66 3 
4 37 75 81 
5 49 69 87 
6 59 0 87 
7 69 91 39 
8 93 75 31 
9 21 15 7 
+0

Итак, из @ user357269 я узнал, что файл был перезаписан и находится в hdf версии 4, а инструменты pandas HDF работают только с версией 5. Спасибо. – BenT

+0

@BenT, я обновил свой ответ - пожалуйста, проверьте – MaxU

+0

У меня нет hdf4 конвертера, поэтому я попробую это. Благодарю. – BenT