2017-08-30 2 views
2

Ich versuche, Werte aus vielen HDF5-Dateien zu pflücken und in einer Liste zu speichern.Wie schließt man eine Datei innerhalb eines Python-Listenverständnisses?

import h5py 
h = [h5py.File('filenum_%s.h5' % (n),'r')['key'][10][10] for n in range(100)] 

Diese Liste Verständnis enthält die Werte am Gitterpunkt (10, 10) in dem 'Schlüssel' Array aus den HDF5 Dateien filenum0.h5 - filenum99.h5.

Es funktioniert, außer, dass es mit dem Fehler um das 50. Element stoppt:
IOError: unable to open file (File accessibilty: Unable to open file)
obwohl ich weiß, dass die Datei vorhanden ist und kann geöffnet werden, wenn ich nicht viele andere Dateien geöffnet haben. Ich denke, ich bekomme den Fehler, weil zu viele Dateien geöffnet wurden.

Gibt es eine Möglichkeit, die Dateien innerhalb dieses Listenverständnisses zu schließen? Oder gibt es eine effektivere Möglichkeit, die gewünschte Liste zu erstellen?

+0

Sie können nicht, Sie wären mit einer traditionellen Schleife besser dran. – jonrsharpe

+0

Siehe diesen Beitrag https://StackOverflow.com/A/45929510/4531270 – pylang

Antwort

4

Indem Sie tun, wie Sie tun, steuern Sie nicht, wenn die Datei geschlossen ist.

Sie können das kontrollieren, aber nicht mit einem Einzeiler. Sie benötigen ein Hilfsverfahren, das die Daten zurückgibt, und schließt die Datei (ein Kontext-Manager ist noch besser als h5py-Dateien unterstützen das, ich habe gerade überprüft)

def get_data(n): 
    with h5py.File('filenum_%s.h5' % (n),'r') as f: 
     return f['key'][10][10] 

dann

h = [get_data(n) for n in range(100)] 

Sie machen könnte Die get_data Funktion ist generischer, indem sie die "Schlüssel" Argumente natürlich nicht hartcodiert 10 &.

+0

eigentlich sollte dies nicht getan werden, sollte nicht in nachvollziehbaren Operationen durchgeführt werden. Vielleicht haben Sie vergessen, das Ergebnis in der Funktion zurückzugeben? – Netwave

+0

Hält 'h5py.File()' die Context Manager-Schnittstelle nicht? – AChampion

+0

Es tut, ja ... Sorry, nicht das Ergebnis, mein schlechtes !! –

2

Aus Gründen der Argumentation Sie, konnte alles in einem einzigen schrecklichen Liste Verständnis wie folgt tun:

import h5py 
h = [(f['key'][10][10], f.close())[0] 
    for f in (h5py.File('filenum_%s.h5' % (n),'r') for n in range(100))] 

Aber ich gegen etwas stark wie das raten würde, und bevorzugen stattdessen eine Hilfsfunktion oder einige anderer Ansatz.

+1

ja, als Gebäude ein Objekt für den Nebeneffekt wird nicht empfohlen. Aber das ist cool genug. pylang verknüpfte Antwort ist auch eine gute Führung: https://stackoverflow.com/a/45929510/4531270 –

Verwandte Themen