touch
est un utilitaire Unix qui définit les heures de modification et d'accès des fichiers à l'heure actuelle. Si le fichier n'existe pas, il est créé avec les autorisations par défaut.
Comment l'implémenteriez-vous en tant que fonction Python? Essayez d'être multiplateforme et complet.
(Les résultats actuels de Google pour "fichier tactile python" ne sont pas très bons, mais indiquent os.utime .)
touch
fonctionnalités similaires à celles de leurs programmes Python, pas comment les réimplémenter à partir de zéro; ces personnes sont mieux servies en faisant défiler la liste jusqu'à lapathlib
solution. Même si elle est maintenant intégrée, cette réponse a un bien meilleur classement Google pour «fichier tactile python» que la documentation pertinente .Réponses:
On dirait que c'est nouveau depuis Python 3.4 -
pathlib
.Cela créera un
file.txt
au chemin.-
la source
pip install pathlib
Path('/some/path').mkdir()
si le répertoire contenant le fichier àtouch()
éditer n'existe pas encore.pathlib2
place depathlib
parce que lepathlib
correctif de bogues est maintenant uniquement. Par conséquent, sur Python 2.7:pip install pathlib2
et puisfrom pathlib2 import Path
.Cela essaie d'être un peu plus sans course que les autres solutions. (Le
with
mot-clé est nouveau dans Python 2.5.)À peu près équivalent à cela.
Maintenant, pour le rendre vraiment sans course, vous devez utiliser
futimes
et modifier l'horodatage du descripteur de fichier ouvert, au lieu d'ouvrir le fichier, puis de modifier l'horodatage du nom de fichier (qui peut avoir été renommé). Malheureusement, Python ne semble pas fournir un moyen d'appelerfutimes
sans passer parctypes
ou similaire ...ÉDITER
Comme l'a noté Nate Parsons , Python 3.3 ajoutera la spécification d'un descripteur de fichier (quand
os.supports_fd
) à des fonctions telles queos.utime
, qui utiliseront lefutimes
syscall au lieu duutimes
syscall sous le capot. En d'autres termes:la source
file
fonction intégrée a été supprimée de Python 3 etopen
doit être utilisée à la place. Cela m'a totalement manqué parce que la coloration syntaxique de l'éditeur que j'utilise (gedit) cible toujours Python 2.la source
open()
appel, le contenu du fichier sera tronqué. Suggérez'a'
plutôt d' utiliser le mode .open(fname, 'a').close()
ne changera pas du tout.os.utime()
des fichiers préexistants.Pourquoi ne pas essayer ça?:
Je crois que cela élimine toute condition de course qui compte. Si le fichier n'existe pas, une exception sera levée.
La seule condition de concurrence possible ici est si le fichier est créé avant l'appel à open () mais après os.utime (). Mais cela n'a pas d'importance car dans ce cas le temps de modification sera comme prévu car il doit s'être produit lors de l'appel à toucher ().
la source
Voici du code qui utilise des ctypes (uniquement testé sur Linux):
la source
Cette réponse est compatible avec toutes les versions depuis Python-2.5 lorsque le mot clé
with
a été publié.1. Créez un fichier s'il n'existe pas + Réglez l'heure actuelle
(exactement la même que la commande
touch
)Une version plus robuste:
2. Il suffit de créer le fichier s'il n'existe pas
(ne met pas à jour l'heure)
3. Il suffit de mettre à jour l'accès aux fichiers / les heures modifiées
(ne crée pas de fichier s'il n'existe pas)
L'utilisation
os.path.exists()
ne simplifie pas le code:Bonus: heure de mise à jour de tous les fichiers d'un répertoire
la source
la source
with open(fn,'a'): pass
ou une alternativeopen(fn, 'a').close()
ne change pas l'heure modifiée en utilisant Python 2.7.5 sur Red Hat 7 (le système de fichiers est XFS). Sur ma plateforme, ces solutions créent simplement un fichier vide s'il n'existe pas. : - /Simpliste:
open
assure qu'il y a un fichierutime
garantit que les horodatages sont mis à jourThéoriquement, il est possible que quelqu'un supprime le fichier après le
open
, provoquant une exception pour utime. Mais c'est sans doute OK, car quelque chose de mauvais s'est produit.la source
Complexe (éventuellement buggy):
Cela essaie également de permettre de définir l'heure d'accès ou de modification, comme GNU touch.
la source
Il peut sembler logique de créer une chaîne avec les variables souhaitées et de la transmettre à os.system:
Ceci est inadéquat à plusieurs égards (par exemple, il ne gère pas les espaces blancs), alors ne le faites pas.
Une méthode plus robuste consiste à utiliser un sous-processus:
subprocess.call(['touch', os.path.join(dirname, fileName)])
Bien que ce soit beaucoup mieux que d'utiliser un sous-shell (avec os.system), il ne convient toujours qu'aux scripts rapides et sales; utilisez la réponse acceptée pour les programmes multiplateformes.
la source
subprocess.call(['touch', os.path.join(dirname, fileName)])
est beaucoup mieux que d'utiliser un sous-shell (avecos.system
). Mais encore, n'utilisez cela que pour des scripts rapides et sales, utilisez la réponse acceptée pour les programmes multiplateformes.touch
n'est pas une commande multiplateforme (par exemple Windows)"open (nom_fichier, 'a'). close ()" ne fonctionnait pas pour moi dans Python 2.7 sous Windows. "os.utime (nom_fichier, aucun)" a très bien fonctionné.
De plus, j'avais besoin de toucher récursivement tous les fichiers d'un répertoire avec une date antérieure à une date. J'ai créé un suivi basé sur la réponse très utile de l'éphémient.
la source
Pourquoi n'essayez-vous pas: newfile.py
ou
la source
Ce qui suit est suffisant:
Si vous souhaitez définir une heure spécifique pour le toucher, utilisez os.utime comme suit:
Ici, atime et mtime doivent tous deux être int / float et doivent être égaux au temps d'époque en secondes au temps que vous voulez régler.
la source
Si cela ne vous dérange pas, sauf ...
Une chose à noter cependant, si un fichier existe avec le même nom, il ne fonctionnera pas et échouera en silence.
la source
write_text()
depathlib.Path
peut être utilisé.la source