store.root.attributes未保存 - Pandas和Pytables

2 投票
1 回答
1192 浏览
提问于 2025-04-21 10:38

我正在把数据文件解析成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

撰写回答