Genereer tijdelijke bestandsnamen zonder dat er werkelijke bestand in Python

stemmen
42

De vraag, nummer 10501247 , in StackOverflow geeft antwoord hoe tijdelijk bestand aan te maken in Python.
Ik hoef alleen maar tijdelijk bestand naam in mijn geval.
Calling tempfile.NamedTemporaryFile () geeft file handle na daadwerkelijke bestanden maken.
Is er manier om alleen de bestandsnaam te krijgen?

# 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')
...
De vraag is gesteld op 24/10/2014 om 03:19
user
In andere talen...                            


6 antwoorden

stemmen
31

Als u een tijdelijk bestand naam wil alleen kun je innerlijke tempfile functie aan te roepen _get_candidate_names():

import tempfile

temp_name = next(tempfile._get_candidate_names())
% e.g. px9cp65s

Bellen nextweer zal terugkeren een andere naam, enz. Dit geeft je niet het pad naar de tijdelijke map te geven. Om default 'tmp' directory te krijgen, te gebruiken:

defult_tmp_dir = tempfile._get_default_tempdir()
% results in: /tmp 
antwoordde op 24/10/2014 om 03:32
bron van user

stemmen
4

Zoals Joachim Isaksson zei in de comments, als je gewoon een naam krijgt u kunnen problemen hebben als een ander programma gebeurt er met die naam te gebruiken voor uw programma doet. De kans is klein, maar niet onmogelijk.

Dus het veilig is om te doen in deze situatie is om de volledige GzipFile () constructeur, die de handtekening heeft gebruikt GzipFile( [filename[, mode[, compresslevel[, fileobj]]]]). Zo kunt u deze doorgeven van de open fileobj, en een bestandsnaam ook, als je wilt. Zie de gzip documentatie voor details.

antwoordde op 24/10/2014 om 04:13
bron van user

stemmen
11

Het is misschien een beetje laat zijn, maar is er iets mis met deze?

import tempfile
with tempfile.NamedTemporaryFile(dir='/tmp', delete=False) as tmpfile:
    temp_file_name = tmpfile.name
f = gzip.open(temp_file_name ,'wb')
antwoordde op 01/05/2015 om 00:32
bron van user

stemmen
6

tempfile.mktemp() doe dit.

Maar let op dat het is verouderd. Maar het zal niet het bestand te maken en het is een publieke functie in tempfile vergelijking met het gebruik van de _get_candidate_names().

De reden dat het is verouderd is te wijten aan de tijd tussen het aanroepen van deze en eigenlijk proberen om het bestand te maken. Maar in mijn geval de kans daarop is zo slank en zelfs als het zou mislukken dat zou aanvaardbaar zijn. Maar het is aan jou om te evalueren voor uw Antwoordcode.

antwoordde op 11/06/2015 om 07:11
bron van user

stemmen
7

Ik denk dat de eenvoudigste en meest veilige manier om dit te doen is zoiets als:

path = os.path.join(tempfile.mkdtemp(), 'something')

Een tijdelijke map wordt aangemaakt dat alleen u toegang, dus er mogen geen veiligheidsproblemen, maar er zullen geen bestanden die zijn gemaakt in, dus je kunt gewoon kiezen uit een willekeurige bestandsnaam die u wilt maken in die map.

antwoordde op 21/08/2017 om 16:52
bron van user

stemmen
4

Het combineren van de vorige antwoorden, mijn oplossing is:

def get_tempfile_name(some_id):
    return os.path.join(tempfile.gettempdir(), next(tempfile._get_candidate_names()) + "_" + some_id)

Maak some_idoptioneel als niet nodig is voor u.

antwoordde op 17/10/2018 om 11:05
bron van user

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more