2012-07-26 15 views
16

El siguiente código me permite crear un directorio si aún no existe.¿Cómo sobrescribir una carpeta si ya existe al crearla con makedirs?

dir = 'path_to_my_folder' 
if not os.path.exists(dir): 
    os.makedirs(dir) 

La carpeta será utilizada por un programa para escribir archivos de texto en esa carpeta. Pero quiero comenzar con una nueva carpeta vacía la próxima vez que se abra mi programa.

¿Hay alguna manera de sobrescribir la carpeta (y crear una nueva, con el mismo nombre) si ya existe?

+1

Debe tenerse en cuenta, aunque puede que no importa a usted, que todas las respuestas aquí tienen condiciones de carrera (y aunque no es realmente es posible eliminarlos por completo tal como se plantea, podrías hacerlo mejor, usando EAFP). – Julian

Respuesta

25
dir = 'path_to_my_folder' 
if os.path.exists(dir): 
    shutil.rmtree(dir) 
os.makedirs(dir) 
7
import shutil 

dir = 'path_to_my_folder' 
if not os.path.exists(dir): 
    os.makedirs(dir) 
else: 
    shutil.rmtree(dir)   #removes all the subdirectories! 
    os.makedirs(dir) 

¿Qué hay de eso? Eche un vistazo a la biblioteca shutilPython!

+0

Esto también funciona ... ¿Pero este es un módulo bastante común? Este código debe implementarse en muchas máquinas. –

+0

@ShankarKumar Sí. 'shutil' es parte de las bibliotecas' de Python' integradas desde 'Python 2.4'. Personalmente, creo que 'shutil' es mejor que' os' debido a algunas simplificaciones que trae. – cybertextron

0

Sólo decir

dir = 'path_to_my_folder' 
if not os.path.exists(dir): # if the directory does not exist 
    os.makedirs(dir) # make the directory 
else: # the directory exists 
    #removes all files in a folder 
    for the_file in os.listdir(dir): 
     file_path = os.path.join(dir, the_file) 
     try: 
      if os.path.isfile(file_path): 
       os.unlink(file_path) # unlink (delete) the file 
     except Exception, e: 
      print e 
+0

¡Gracias, esto funciona genial! ¿Te importa explicar la lógica detrás de esto? ¡Soy un principiante, así que estoy tratando de aprender todo lo que puedo! –

+0

Sin embargo, esto fallaría si tuviera subdivisiones en el directorio que intenta eliminar. Entonces querrías llamar a 'os.walk' para arreglar eso. Una solución más simple sería usar 'shutil.rmtree'. – inspectorG4dget

+0

¿Sería eso inmune a las condiciones de carrera? –

0

EAFP (see about it here) versión

import errno 
import os 
from shutil import rmtree 
from uuid import uuid4 

path = 'path_to_my_folder' 
temp_path = os.path.dirname(path)+'/'+str(uuid4()) 
try: 
    os.renames(path, temp_path) 
except OSError as exception: 
    if exception.errno != errno.ENOENT: 
     raise 
else: 
    rmtree(temp_path) 
os.mkdir(path) 
+0

¡Bienvenido al desbordamiento de pila! Esto vino a mí para su revisión como su primera respuesta. Al responder una pregunta anterior con una respuesta aceptada, vale la pena destacar lo que está agregando a las soluciones existentes. En este caso, ¿puedes explicar por qué crees que este código es inmune a las condiciones de carrera? Por ejemplo, ¿qué sucede si un archivo se escribe en el directorio después de la llamada a glob.iglob()? ¿Puede describir una razón por la cual su solución está menos sujeta a la condición de raza? Además: puede pensar en explicar lo que significa EAFP. * NB He vuelto a publicar comentarios editados debido a un error en el original * –

+0

@JRichardSnape Sí, tienes razón, este código no es inmune a las condiciones de la carrera. La nueva versión, en mi opinión, cumple este requisito –

Cuestiones relacionadas