Die Frage mit der Nummer 10501247 im Stackoverflow gibt eine Antwort zum Erstellen einer temporären Datei in Python.
In meinem Fall muss ich nur einen temporären Dateinamen haben.
Wenn Sie tempfile.NamedTemporaryFile () aufrufen, wird das Dateihandle nach der eigentlichen Dateierstellung zurückgegeben.
Gibt es eine Möglichkeit, nur den Dateinamen abzurufen?
# Trying to get temp file path
tf = tempfile.NamedTemporaryFile()
temp_file_name = tf.name
tf.close()
# Here is my real purpose to get the temp_file_name
f = gzip.open(temp_file_name ,'wb')
...
python
temporary-files
Hügel
quelle
quelle
NamedTemporaryFile
garantiert einen eindeutigen Namen (wahrscheinlich), indem er versucht und erneut versucht wird, falls vorhanden. Wenn Sie nur einen Namen erhalten, können Sie nicht garantieren, dass Sie die Datei später tatsächlich erstellen können. Sie öffnen sich der Race-Bedingung einer anderen Person, die denselben Namen vor Ihnen verwendet.Antworten:
Wenn Sie nur einen temporären Dateinamen möchten, können Sie die innere temporäre Funktion aufrufen
_get_candidate_names()
:Wenn Sie
next
erneut anrufen , wird ein anderer Name usw. zurückgegeben. Dies gibt Ihnen nicht den Pfad zum temporären Ordner. Verwenden Sie zum Abrufen des Standardverzeichnisses 'tmp':quelle
temp_dir = tempfile.mkdtemp(prefix='some-prefix_')
, ein temporäres Verzeichnis zu erstellen, besteht darin, ein temporäres Verzeichnis sicher zu erstellen und eine Zeichenfolge mit dem absoluten Pfad zurückzugeben.next(tempfile._get_candidate_names())
nicht unbedingt ein nicht vorhandener Pfad zurückgegeben wird. Aus diesem Grund können Tempfile-Schnittstellen auf Benutzerebene mehrere Namen ausprobieren, bis ein nicht verwendeter gefunden wird :tempfile.gettempdir()
statt privat verwendentempfile._get_default_tempdir()
.tempfile.mkdtemp
der Benutzer für die Löschung des temporären Verzeichnisses und seines Inhalts verantwortlich ist, wenn er damit fertig ist.Ich denke, der einfachste und sicherste Weg, dies zu tun, ist etwa:
Es wird ein temporäres Verzeichnis erstellt, auf das nur Sie zugreifen können. Es sollten also keine Sicherheitsprobleme auftreten, es werden jedoch keine Dateien erstellt. Sie können also einfach einen beliebigen Dateinamen auswählen, den Sie in diesem Verzeichnis erstellen möchten.
Bearbeiten: In Python 3 können Sie jetzt
tempfile.TemporaryDirectory()
als Kontextmanager das Löschen für Sie übernehmen:quelle
tempfile.mkdtemp
der Benutzer für die Löschung des temporären Verzeichnisses und seines Inhalts verantwortlich ist, wenn er damit fertig ist.tempfile.TemporaryDirectory()
als Kontextmanager verwenden, wird dieser für Sie gelöscht.Es mag etwas spät sein, aber stimmt etwas nicht?
quelle
without creating actual file in Python
.tempfile.mktemp()
mach das.Beachten Sie jedoch, dass es veraltet ist. Die Datei wird jedoch nicht erstellt, und es handelt sich um eine öffentliche Funktion in tempfile im Vergleich zur Verwendung von
_get_candidate_names()
.Der Grund, warum es veraltet ist, liegt in der Zeitspanne zwischen dem Aufruf und dem tatsächlichen Versuch, die Datei zu erstellen. In meinem Fall ist die Chance dafür jedoch so gering, und selbst wenn dies fehlschlagen würde, wäre dies akzeptabel. Aber es liegt an Ihnen, für Ihren Anwendungsfall zu bewerten.
quelle
tempfile.mktemp
Dokumentation). Das sollte also nicht als akzeptabel angesehen werden.os.path.join(tempfile.mkdtemp(), 'something')
Dort wird zumindest das Verzeichnis erstellt (und gehört Ihnen, nehme ich an).Meine Lösung kombiniert die vorherigen Antworten und lautet:
Machen Sie
some_id
optional, wenn nicht für Sie benötigt.quelle
_get_candidate_names()
jedoch nicht vorhanden ist, kann standardmäßig ein halbzufälliger Zeichenfolgengenerator verwendet werden. Zum Beispiel eine UUID.Wie Joachim Isaksson in den Kommentaren sagte, können Sie Probleme haben, wenn Sie nur einen Namen erhalten, wenn ein anderes Programm diesen Namen verwendet, bevor Ihr Programm dies tut. Die Chancen sind gering, aber nicht unmöglich.
In dieser Situation ist es daher sicher, den vollständigen GzipFile () -Konstruktor zu verwenden, der über die Signatur verfügt
GzipFile( [filename[, mode[, compresslevel[, fileobj]]]])
. Sie können also die geöffnete Dateiobjj und, wenn Sie möchten, auch einen Dateinamen übergeben. Weitere Informationen finden Sie in den gzip-Dokumenten.quelle