touch
ist ein Unix-Dienstprogramm, das die Änderungs- und Zugriffszeiten von Dateien auf die aktuelle Tageszeit festlegt. Wenn die Datei nicht vorhanden ist, wird sie mit Standardberechtigungen erstellt.
Wie würden Sie es als Python-Funktion implementieren? Versuchen Sie plattformübergreifend und vollständig zu sein.
(Die aktuellen Google-Ergebnisse für "Python Touch-Datei" sind nicht so gut, verweisen jedoch auf os.utime .)
touch
ähnliche Funktionen in ihren Python-Programmen erreichen und nicht wie sie von Grund auf neu implementiert werden. Diese Personen werden am besten bedient, indem Sie zurpathlib
Lösung scrollen . Obwohl diese Antwort jetzt integriert ist, hat sie ein viel besseres Google-Ranking für "Python Touch-Datei" als die entsprechende Dokumentation .Antworten:
Sieht so aus, als wäre dies ab Python 3.4 - neu
pathlib
.Dadurch wird ein
file.txt
am Pfad erstellt.- -
quelle
pip install pathlib
Path('/some/path').mkdir()
wenn das Verzeichnis mit der zutouch()
bearbeitenden Datei noch nicht vorhanden ist.pathlib2
anstelle von verwenden,pathlib
weilpathlib
jetzt nur Bugfix ist. Deshalb auf Python 2.7:pip install pathlib2
und dannfrom pathlib2 import Path
.Dies versucht, etwas rennfreier zu sein als die anderen Lösungen. (Das
with
Schlüsselwort ist neu in Python 2.5.)Etwa gleichwertig.
Um es wirklich rennfrei zu machen, müssen Sie
futimes
den Zeitstempel des geöffneten Dateihandles verwenden und ändern, anstatt die Datei zu öffnen und dann den Zeitstempel des Dateinamens (der möglicherweise umbenannt wurde) zu ändern. Leider scheint Python keine Möglichkeit zum Anrufen zu bieten,futimes
ohne durchzugehenctypes
oder ähnliches ...BEARBEITEN
Wie von Nate Parsons bemerkt , fügt Python 3.3 Funktionen wie z. B. einen Dateideskriptor (wann
os.supports_fd
) hinzuos.utime
, der denfutimes
Syscall anstelle desutimes
Syscall unter der Haube verwendet. Mit anderen Worten:quelle
file
Funktion wurde aus Python 3 entfernt undopen
muss stattdessen verwendet werden. Ich habe das total verpasst, weil die Syntaxhervorhebung des von mir verwendeten Editors (gedit) immer noch auf Python 2 abzielt.quelle
open()
Aufruf erreicht, wird der Inhalt der Datei abgeschnitten. Schlagen Sie'a'
stattdessen die Verwendung des Modus vor.open(fname, 'a').close()
ändert sich aber zeitweise nicht.os.utime()
dort für bereits vorhandene Dateien belassen.Warum nicht mal probieren?:
Ich glaube, dies beseitigt alle wichtigen Rennbedingungen. Wenn die Datei nicht vorhanden ist, wird eine Ausnahme ausgelöst.
Die einzig mögliche Racebedingung ist hier, wenn die Datei vor dem Aufruf von open (), aber nach os.utime () erstellt wird. Dies spielt jedoch keine Rolle, da in diesem Fall die Änderungszeit wie erwartet ist, da sie während des Aufrufs von touch () aufgetreten sein muss.
quelle
Hier ist ein Code, der ctypes verwendet (nur unter Linux getestet):
quelle
Diese Antwort ist mit allen Versionen seit Python-2.5 kompatibel, wenn das Schlüsselwort
with
veröffentlicht wurde.1. Datei erstellen, falls nicht vorhanden + Aktuelle Zeit einstellen
(genau wie Befehl
touch
)Eine robustere Version:
2. Erstellen Sie einfach die Datei, wenn sie nicht vorhanden ist
(aktualisiert die Zeit nicht).
3. Aktualisieren Sie einfach den Dateizugriff / die geänderten Zeiten
(erstellt keine Datei, wenn diese nicht vorhanden ist).
Die Verwendung
os.path.exists()
vereinfacht den Code nicht:Bonus: Aktualisierungszeit aller Dateien in einem Verzeichnis
quelle
quelle
with open(fn,'a'): pass
oder alternativopen(fn, 'a').close()
Ändern Sie die geänderte Zeit nicht mit Python 2.7.5 unter Red Hat 7 (Dateisystem ist XFS). Auf meiner Plattform erstellen diese Lösungen nur eine leere Datei, wenn sie nicht vorhanden ist. : - /Simpel:
open
stellt sicher, dass dort eine Datei vorhanden istutime
gewährleistet , dass die Zeitstempel aktualisiert werdenTheoretisch ist es möglich, dass jemand die Datei nach dem löscht
open
, wodurch utime eine Ausnahme auslöst. Aber wohl ist das in Ordnung, da etwas Schlimmes passiert ist.quelle
Komplex (möglicherweise fehlerhaft):
Dies versucht auch das Einstellen der Zugriffs- oder Änderungszeit zu ermöglichen, wie z. B. GNU touch.
quelle
Es mag logisch erscheinen, eine Zeichenfolge mit den gewünschten Variablen zu erstellen und an os.system zu übergeben:
Dies ist in vielerlei Hinsicht unzureichend (z. B. wird kein Leerzeichen verarbeitet). Tun Sie es also nicht.
Eine robustere Methode ist die Verwendung eines Unterprozesses:
subprocess.call(['touch', os.path.join(dirname, fileName)])
Dies ist zwar viel besser als die Verwendung einer Subshell (mit os.system), eignet sich jedoch nur für Quick-and-Dirty-Skripte. Verwenden Sie die akzeptierte Antwort für plattformübergreifende Programme.
quelle
subprocess.call(['touch', os.path.join(dirname, fileName)])
ist viel besser als die Verwendung einer Subshell (mitos.system
). Verwenden Sie dies jedoch nur für schnelle und schmutzige Skripte. Verwenden Sie die akzeptierte Antwort für plattformübergreifende Programme.touch
ist kein plattformübergreifender Befehl (z. B. Windows)"open (Dateiname, 'a'). close ()" funktionierte in Python 2.7 unter Windows nicht. "os.utime (Dateiname, Keine)" funktionierte einwandfrei.
Außerdem musste ich alle Dateien in einem Verzeichnis mit einem Datum, das älter als ein Datum ist, rekursiv berühren. Ich habe das Folgende basierend auf der sehr hilfreichen Antwort von Ephemient erstellt.
quelle
Warum versuchst du es nicht: newfile.py
oder
quelle
Folgendes ist ausreichend:
Wenn Sie eine bestimmte Berührungszeit festlegen möchten, verwenden Sie os.utime wie folgt:
Hier sollten atime und mtime beide int / float sein und der Epochenzeit in Sekunden entsprechen, die Sie einstellen möchten.
quelle
Wenn Ihnen der Versuch nichts ausmacht - außer dann ...
Beachten Sie jedoch, dass eine Datei mit demselben Namen nicht funktioniert und im Hintergrund fehlschlägt.
quelle
write_text()
vonpathlib.Path
kann verwendet werden.quelle