web-dev-qa-db-fra.com

Suppression du jeu de données hdf5 à l’aide de h5py

Est-il possible de supprimer un ensemble de données d'un fichier hdf5, de préférence à l'aide de h5py? Ou bien, est-il possible d'écraser un jeu de données tout en conservant les autres jeux de données?

A ma connaissance, h5py peut lire/écrire des fichiers hdf5 en 5 modes

f = h5py.File("filename.hdf5",'mode')

où mode peut être r pour lire, r+ pour lecture-écriture, a pour lecture-écriture mais crée un nouveau fichier s'il n'existe pas, w pour écriture/écrasement, et w- identique à w mais échoue si le fichier existe déjà J'ai tout essayé mais aucun ne semble fonctionner. 

Les suggestions sont très appréciées.

17
hsnee

Oui, cela peut être fait. 

with h5py.File(input,  "a") as f:
    del f[datasetname]

Vous devez ouvrir le fichier en mode écriture, par exemple ajouter (comme ci-dessus) ou écrire.

Comme noté par @ seppo-enarvi dans les commentaires, l'objectif de la fonction précédemment recommandée f.__delitem__(datasetname) est d'implémenter l'opérateur del, afin de pouvoir supprimer un ensemble de données à l'aide de del f[datasetname]

27
EnemyBagJones

Je ne comprends pas ce que votre question a à voir avec les modes d'ouverture de fichier. Pour lire/écrire, r + est la voie à suivre.

À ma connaissance, la suppression n'est pas facile/possible, en particulier si vous faites la taille du fichier ne sera pas réduite.

Mais écraser le contenu n'est pas un problème

f['mydataset'][:] = 0
0
agomcas

J'ai essayé cela et la seule façon de réduire la taille du fichier est de tout copier dans un nouveau fichier en laissant simplement le jeu de données qui ne m'intéresse pas:

fs = h5py.File('WFA.h5', 'r')
fd = h5py.File('WFA_red.h5', 'w')
for a in fs.attrs:
    fd.attrs[a] = fs.attrs[a]
for d in fs:
    if not 'SFS_TRANSITION' in d: fs.copy(d, fd)
0
Felix