store.root.attributes未保存 - Pandas和Pytables
我正在把数据文件解析成pandas的数据框,然后用HDFStore把这些文件保存为hdf5格式。代码如下:
def convert_folder_hdf5(folder, save_loc=None):
if save_loc is None:
save_loc = folder
filename = save_loc+'\\' + (folder.split('\\')[-1])+'.h5'
store = pd.HDFStore(filename, format="table", complevel=9, complib='blosc')
data = import_folder(folder)
if data['voltage recording'] is not None:
store['voltage_recording'] = data['voltage recording']
if data['linescan'] is not None:
store['linescan'] = data['linescan']
store.root.attributes = data['file attributes']
store.close()
但是,当我想访问store.root.attributes时,出现了以下问题:
tables.exceptions.NoSuchNodeError: group ``/`` does not have a child named ``attributes``
store.root返回的结果是(这个特定的文件夹没有linescan文件):
/ (RootGroup) ''
children := ['voltage_recording' (Group)]
在控制台里,我可以手动执行以下操作:
store.root.attributes = data['file attributes']
然后当我调用store.root.attributes时,我得到了我期待的结果。
不过,如果我重新保存这个文件,然后再打开它,之前在store.root.attributes中设置的内容就消失了(我又遇到了上面的错误)。
1 个回答
1
你不能直接在一个节点里存东西,而是要在节点的属性部分存储。从这里可以看到,你需要先创建一个节点,然后使用.attrs
这个属性来找到可以存放内容的地方。
下面是一个直接的方法:
In [16]: store.root._v_attrs.attributes = 'bar'
In [17]: store.root._v_attrs
Out[17]:
/._v_attrs (AttributeSet), 5 attributes:
[CLASS := 'GROUP',
PYTABLES_FORMAT_VERSION := '2.1',
TITLE := '',
VERSION := '1.0',
attributes := 'bar']
Pandas 还在开发一个更通用的接口来获取和设置属性,欢迎留言讨论:https://github.com/pydata/pandas/pull/7334
另外,当你打开HDFStore
时,如果指定format='table'
,这个设置会被忽略。这个设置只适用于to_hdf
。你不能为整个存储设置格式,只能逐个对象设置。http://pandas.pydata.org/pandas-docs/stable/io.html#table-format