Edit : Voir aussi la réponse de Dave Jones : à partir de Python 3.3, vous pouvez utiliser l' xindicateur open()pour fournir cette fonction.
Réponse originale ci-dessous
Oui, mais sans utiliser l' open()appel standard de Python . Vous devrez utiliser à la os.open()place, ce qui vous permet de spécifier des indicateurs pour le code C sous-jacent.
En particulier, vous souhaitez utiliser O_CREAT | O_EXCL. Depuis la page de manuel de open(2)under O_EXCLsur mon système Unix:
Assurez-vous que cet appel crée le fichier: si cet indicateur est spécifié en conjonction avec O_CREAT, et que le chemin existe déjà, alors open()échouera. Le comportement de O_EXCLn'est pas défini s'il O_CREATn'est pas spécifié.
Lorsque ces deux indicateurs sont spécifiés, les liens symboliques ne sont pas suivis: si le chemin d'accès est un lien symbolique, alors open()échoue quel que soit l'endroit où le lien symbolique pointe.
O_EXCL est uniquement pris en charge sur NFS lors de l'utilisation de NFSv3 ou version ultérieure sur le noyau 2.6 ou version ultérieure. Dans les environnements où la O_EXCLprise en charge NFS n'est pas fournie, les programmes qui en dépendent pour effectuer des tâches de verrouillage contiendront une condition de concurrence.
Ce n'est donc pas parfait, mais AFAIK est le plus proche pour éviter cette condition de course.
Edit: les autres règles d'utilisation os.open()au lieu de open()s'appliquent toujours. En particulier, si vous souhaitez utiliser le descripteur de fichier renvoyé pour la lecture ou l'écriture, vous aurez également besoin de l'un des indicateurs O_RDONLY, O_WRONLYou O_RDWR.
Tous les O_*indicateurs sont dans le osmodule de Python , vous devrez donc import oset utiliser os.O_CREATetc.
Exemple:
import os
import errno
flags = os.O_CREAT | os.O_EXCL | os.O_WRONLY
try:
file_handle = os.open('filename', flags)
except OSError as e:
if e.errno == errno.EEXIST: # Failed as the file already exists.
pass
else: # Something unexpected went wrong so reraise the exception.
raise
else: # No exception, so the file must have been created successfully.
with os.fdopen(file_handle, 'w') as file_obj:
# Using `os.fdopen` converts the handle to an object that acts like a
# regular Python file object, and the `with` context manager means the
# file will be automatically closed when we're done with it.
file_obj.write("Look, ma, I'm writing to a new file!")