2014-05-21 12 views
9

Wie verwende ich with open() as f: ..., um die Datei in ein Verzeichnis zu schreiben, das nicht existiert.Python: Datei in Verzeichnis schreiben existiert nicht

Zum Beispiel:

with open('/Users/bill/output/output-text.txt', 'w') as file_to_write: 
    file_to_write.write("{}\n".format(result)) 

Lassen Sie uns sagen, dass das /Users/bill/output/ Verzeichnis existiert nicht. Wenn das Verzeichnis nicht existiert, erstellen Sie einfach das Verzeichnis und schreiben Sie die Datei dort.

+0

ich verwendet habe [diese Schnipsel] (http://code.activestate.com/recipes/82465-a-friendly-mkdir/) für Jahre und Jahre . – dabhaid

Antwort

17

Sie müssen zuerst das Verzeichnis erstellen.

Die mkdir -p Implementierung from this answer wird genau das tun, was Sie wollen. mkdir -p erstellt beliebige übergeordnete Verzeichnisse nach Bedarf und führt im Hintergrund nichts aus, wenn es bereits vorhanden ist.

Hier habe ich eine safe_open_w() Methode implementiert, die mkdir_p auf dem Verzeichnisteil des Pfades aufruft, bevor die Datei zum Schreiben zu öffnen:

import os, os.path 
import errno 

# Taken from https://stackoverflow.com/a/600612/119527 
def mkdir_p(path): 
    try: 
     os.makedirs(path) 
    except OSError as exc: # Python >2.5 
     if exc.errno == errno.EEXIST and os.path.isdir(path): 
      pass 
     else: raise 

def safe_open_w(path): 
    ''' Open "path" for writing, creating any parent directories as needed. 
    ''' 
    mkdir_p(os.path.dirname(path)) 
    return open(path, 'w') 

with safe_open_w('/Users/bill/output/output-text.txt') as f: 
    f.write(...) 
+0

Dies ist eine gute Antwort. Nur zur Verdeutlichung muss die 'mkdir_p'-Funktion, die in Ihrem Code verwendet wird, ebenfalls unter Verwendung des bereitgestellten Links definiert werden. Es kommt nicht mit Python. – huu

+0

@HuuNguyen Diese Klarstellung hinzugefügt, danke. Immer noch nicht sicher, warum jemand das abgelehnt hat. –

+0

Für 'exc.errno == errno.EEXIST' habe ich den Fehler: ' NameError: globaler Name 'errno' ist nicht definiert. Es wurde in 'exc.errno == 17' geändert. –

6

liberale Verwendung des os Modul Marke:

import os 

if not os.path.isdir('/Users/bill/output'): 
    os.mkdir('/Users/bill/output') 

with open('/Users/bill/output/output-text.txt', 'w') as file_to_write: 
    file_to_write.write("{}\n".format(result)) 
+0

Dies funktioniert nicht, die Zwischenverzeichnisse auch zu machen. –

+0

Natürlich nicht, und das ist eine vollständige Annahme meinerseits. Ich denke, '/ Users/bill' existiert jedoch. – huu

-1

Sie können einfach erstellen den Pfad, den Sie die Datei erstellen wollen mit os.makedirs:

import os 
import errno 

def make_dir(path): 
    try: 
     os.makedirs(path, exist_ok=True) # Python>3.2 
    except TypeError: 
     try: 
      os.makedirs(path) 
     except OSError as exc: # Python >2.5 
      if exc.errno == errno.EEXIST and os.path.isdir(path): 
       pass 
      else: raise 

Quelle: this SO Lösung

Verwandte Themen