Cette solution tente d'être un peu plus exempte de race que les autres. (Les with
est nouveau dans Python 2.5).
import os
def touch(fname, times=None):
with open(fname, 'a'):
os.utime(fname, times)
C'est à peu près l'équivalent de ce qui suit.
import os
def touch(fname, times=None):
fhandle = open(fname, 'a')
try:
os.utime(fname, times)
finally:
fhandle.close()
Maintenant, pour qu'il n'y ait vraiment pas de course, vous devez utiliser futimes
et modifier l'horodatage du dossier ouvert, au lieu d'ouvrir le fichier et de modifier ensuite l'horodatage du nom de fichier (qui peut avoir été renommé). Malheureusement, Python ne semble pas fournir de moyen d'appeler futimes
sans passer par ctypes
ou similaire...
EDITAR
Comme l'a noté Nate Parsons Python 3.3 sera ajouter spécifier un descripteur de fichier (lorsque os.supports_fd
) à des fonctions telles que os.utime
qui utilisera l'option futimes
au lieu de l'appel système utimes
syscall sous le capot. En d'autres termes :
import os
def touch(fname, mode=0o666, dir_fd=None, **kwargs):
flags = os.O_CREAT | os.O_APPEND
with os.fdopen(os.open(fname, flags=flags, mode=mode, dir_fd=dir_fd)) as f:
os.utime(f.fileno() if os.utime in os.supports_fd else fname,
dir_fd=None if os.supports_fd else dir_fd, **kwargs)
7 votes
Veuillez envisager de mettre à jour la réponse acceptée maintenant que cette fonctionnalité est intégrée dans la stdlib de Python.
0 votes
@Miles La réponse acceptée fait exactement ce que la question demandait - elle implémente la fonction en Python au lieu d'utiliser une bibliothèque.
10 votes
@styrofoamfly La bibliothèque standard est de Python. Il est très probable que ce que l'auteur de la question veut vraiment savoir (et la plupart des gens qui arrivent à cette question via Google) est comment obtenir
touch
-dans leurs programmes Python, et non comment les réimplémenter à partir de zéro ; ces personnes sont mieux servies en défilant vers le bas jusqu'à la page d'accueil.pathlib
solution. Même si elle est maintenant intégrée, cette réponse a un bien meilleur classement dans Google pour "python touch file" que la documentation pertinente .1 votes
@miles Python 2 est (malheureusement) toujours plus utilisé que 3, donc je pense que la réponse acceptée est toujours la plus pertinente. Mais votre commentaire fait un bon travail en orientant les gens vers la deuxième réponse.
9 votes
Python 2 est en fin de vie à la fin de cette année.