2012-09-29 13 views
166

Ich möchte eine Datei mit Pfad x mit Python erstellen. Ich verwende os.system(y) wo y = 'touch %s' % (x). Ich habe nach einer Nicht-Verzeichnisversion von os.mkdir gesucht, aber ich konnte nichts finden. Gibt es ein Tool wie dieses, um eine Datei zu erstellen, ohne sie zu öffnen oder System oder Popen/Subprozess zu verwenden?Erstellen Sie eine leere Datei mit Python

+2

Warum ist das Öffnen schlecht? –

+0

@LevLevitsky, weil ich es wieder schließen müsste: P. Ich muss Tausende von Dateien erstellen und das Berühren der Datei scheint sauberer zu sein. – tkbx

+1

FYI, während die Verwendung eines externen Befehls für diese immer schlecht ist, wäre die richtige Art, es auszuführen, subprocess.call (['touch', x]) ' – ThiefMaster

Antwort

302

Es gibt keine Möglichkeit, eine Datei zu erstellen, ohne Öffnen es Es gibt os.mknod("newfile.txt") (aber es erfordert Root-Rechte auf OSX). Der Systemaufruf zum Erstellen einer Datei ist eigentlich open() mit dem O_CREAT Flag. Egal wie, Sie werden die Datei immer öffnen.

So ist der einfachste Weg, um einfach eine Datei zu erstellen, ohne dass es für den Fall, zu Kürzen es existiert, ist dies:

open(x, 'a').close() 

Eigentlich könnte man die .close() weglassen, da die Refcounting GC von CPython wird es unmittelbar nach der open() Aussage schließen fertig - aber es ist sauberer, dies explizit zu tun, und es ist auch nicht gut, sich auf CPython-spezifisches Verhalten zu verlassen.

Falls Sie touch ‚s Verhalten (dh aktualisieren Sie die mtime, falls die Datei vorhanden ist):

import os 
def touch(path): 
    with open(path, 'a'): 
     os.utime(path, None) 

du auch alle Verzeichnisse im Pfad erstellen erweitern könnte, die nicht existieren:

basedir = os.path.dirname(path) 
if not os.path.exists(basedir): 
    os.makedirs(basedir) 
+0

Sieht gut aus ... "Truncate" ist im Wesentlichen "klar", oder? – tkbx

+6

Ja, das Öffnen einer Datei mit dem 'w' (write) Flag leert es beim Öffnen mit' a' (append) nicht. – ThiefMaster

+10

Refcounting Schließen der Datei sofort ist nicht verlässlich. Dies ist keine Frage der Sauberkeit, da Refcounting nur ein Implementierungsdetail ist. Kein Python außer CPython tut es. Möchten Sie Ihr Programm mit PyPy fünfmal schneller machen oder es in einer Java/.NET-Umgebung mit Jython/IronPython ausführen? Schade, dass du diese Dateien nicht geschlossen hast, jetzt ist dein Programm wie ein Sieb undicht;) Es ist besonders schrecklich seit 2.5, als 'mit' macht es * einfacher * die Datei rechtzeitig zu schließen (und sogar angesichts von Ausnahmen und Zirkelverweisen) ** und ** der Code wird klarer zum Booten. – delnan

27

Natürlich gibt es eine Möglichkeit, Dateien ohne Öffnen zu erstellen. Es ist so einfach wie das Telefonieren os.mknod("newfile.txt"). Der einzige Nachteil ist, dass dieser Aufruf Root-Rechte für OSX benötigt.

+0

Großer Punkt. Siehe auch https://docs.python.org/3/library/os.html – poolie

Verwandte Themen