Editar : Veja também a resposta de Dave Jones : no Python 3.3, você pode usar o xsinalizador open()para fornecer essa função.
Resposta original abaixo
Sim, mas não usando a open()chamada padrão do Python . Em os.open()vez disso, você precisará usar , o que permite especificar sinalizadores para o código C subjacente.
Em particular, você deseja usar O_CREAT | O_EXCL. A partir da página homem por open(2)debaixo O_EXCLno meu sistema Unix:
Certifique-se de que esta chamada cria o arquivo: se este sinalizador for especificado em conjunto com O_CREAT, e o nome do caminho já existir, open()haverá falha. O comportamento de O_EXCLé indefinido se O_CREATnão for especificado.
Quando esses dois sinalizadores são especificados, os links simbólicos não são seguidos: se o nome do caminho for um link simbólico, ele open()falhará independentemente de para onde o link simbólico aponta.
O_EXCL só é compatível com NFS ao usar NFSv3 ou posterior no kernel 2.6 ou posterior. Em ambientes onde o O_EXCLsuporte a NFS não é fornecido, os programas que dependem dele para executar tarefas de bloqueio conterão uma condição de corrida.
Portanto, não é perfeito, mas AFAIK é o mais perto que você pode chegar de evitar essa condição de corrida.
Editar: as outras regras de uso em os.open()vez de open()ainda se aplicam. Em particular, se você quiser usar o descritor de arquivo retornado para ler ou escrever, você vai precisar de um dos O_RDONLY, O_WRONLYou O_RDWRbandeiras também.
Todos os O_*sinalizadores estão no osmódulo do Python , então você precisará import osusar os.O_CREATetc.
Exemplo:
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!")