Domanda In python, creare un tempfile nella stessa directory di un altro file?


Devo aggiornare un file. L'ho letto e lo ho scritto con le modifiche. Tuttavia, preferirei scrivere su un file temporaneo e rinominarlo in posizione.

temp = tempfile.NamedTemporaryFile()
tempname = temp.name
temp.write(new_data)
temp.close()
os.rename(tempname, data_file_name)

Il problema è che tempfile.NamedTemporaryFile() rende il file temporaneo dentro /tmp che è un file system diverso. Questo significa os.rename() non riesce. Se io uso shlib.move() invece, non ho l'aggiornamento atomico fornito da "mv" (per i file nello stesso file system, yadda, yadda, ecc.)

lo so tempfile.NamedTemporaryFile() prende un parametro "dir", ma data_file_name potrebbe essere "foo.txt" nel qual caso dir = '.'; o data_file_name potrebbe essere "/path/to/the/data/foo.txt"nel qual caso dir ="/path/to/the/data".

Quello che mi piacerebbe davvero è che il file temp sia data_file_name + "alcuni dati casuali". Ciò avrebbe il vantaggio di fallire in un modo che lascerebbe indizi utili.

Suggerimenti?


11
2018-01-05 15:52


origine


risposte:


Puoi usare:

  • prefix per fare in modo che il file temporaneo inizi con lo stesso nome di file originale.
  • dir per specificare dove posizionare il file temporaneo.
  • os.path.split per dividere la directory dal nome del file.

import tempfile
import os
dirname, basename = os.path.split(filename)
temp = tempfile.NamedTemporaryFile(prefix=basename, dir=dirname)
print(temp.name)

17
2018-01-05 16:04



È possibile passare un percorso file nel parametro del costruttore 'dir'. Funziona, come desideri.

>>> t = tempfile.NamedTemporaryFile(dir="/Users/rafal")
>>> t.name
'/Users/rafal/tmplo45Js'

Fonte: http://docs.python.org/library/tempfile.html#tempfile.NamedTemporaryFile


4
2018-01-05 16:01



Per soddisfare tutti i tuoi checklist penso che vorresti usare ...

temp = tempfile.NamedTemporaryFile(prefix=data_file_name, dir=path,
                                   delete=False)

Importante avere il delete=False, perché altrimenti:

[...] Se delete è true (il valore predefinito), il file viene eliminato non appena è   chiuso.


4
2018-01-05 16:06



Uso l'ora corrente come "alcuni dati casuali" aggiunti a una stringa di base per un nome file temporaneo univoco:

import time

temp_file_name = data_file_name + str(time.time()) 

2
2018-01-05 15:59



Il tempfile il modulo che usi fornisce un modo sicuro di gestire i file temporanei. Se si vuole veramente utilizzare il proprio sistema, si dovrebbe essere consapevoli che potrebbe essere vulnerabile agli attacchi (in particolare gli attacchi symlink).

Un modo semplice per generare un nome file temporaneo univoco (anche se un nome piuttosto lungo) è:

import uuid
import os

tempfilename = 'myprefix-%s.dat' % str(uuid.uuid4())

with open(tempfilename, 'rw') as tempfile:
    # do stuff

os.remove(tempfilename)

Ma questo è un po 'hackerato; davvero piuttosto considerare di usare il tempfile modulo con il corretto prefix e dir parametri passati a NamedTemporaryFile, come descritto nelle altre risposte.


-1
2018-01-05 16:16