2014-05-21 24 views
9

Come utilizzare with open() as f: ... per scrivere il file in una directory che non esiste.Python: il file di scrittura nella directory non esiste

Ad esempio:

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

Diciamo che la directory /Users/bill/output/ non esiste. Se la directory non esiste basta creare la directory e scrivere il file lì.

+0

Sto usando [questo frammento] (http://code.activestate.com/recipes/82465-a-friendly-mkdir/) per anni e anni . – dabhaid

risposta

17

È necessario prima creare la directory.

L'implementazione mkdir -pfrom this answer farà esattamente quello che desideri. mkdir -p creerà qualsiasi directory padre come richiesto e silenziosamente non farà nulla se già esiste.

Qui ho implementato un metodo che chiama safe_open_w()mkdir_p da parte di directory del percorso, prima di aprire il file per la scrittura:

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

Questa è un'ottima risposta. Solo per chiarimenti, la funzione 'mkdir_p' usata nel tuo codice deve essere definita pure, usando il link fornito. Non viene con Python. – huu

+0

@HuuNguyen Aggiunto questo chiarimento, grazie. Ancora non sono sicuro del motivo per cui qualcuno ha downvoted questo. –

+0

Per 'exc.errno == errno.EEXIST' ho ricevuto l'errore: ' NameError: nome globale 'errno' non definito '. Cambiarlo in 'exc.errno == 17' ha funzionato. –

6

Fare un uso liberale del modulo os:

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

Questo non gestisce la creazione delle directory intermedie. –

+0

Certo che no, e questa è una supposizione completa da parte mia. Penso che '/ Users/bill' esista comunque. – huu

-1

È possibile solo creare il percorso che si desidera creare il file utilizzando 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 

Fonte: this SO soluzione

Problemi correlati