Estoy tratando de ejecutar una declaración, pero si falla, quiero ejecutar la declaración de excepción y luego quiero ejecutar el intento nuevamente. Sé que puedo usar bucles, pero estoy buscando una solución más elegante.
En mi caso de uso, trato de guardar un archivo en una carpeta, pero si obtengo el FileNotFoundError, quiero crear la carpeta en la excepción y volver a intentarlo.
from pathlib import Path import os folder = Path('folder') df = [a,b,c] try: df.to_feather(folder / 'abc.ftr') except: os.makedirs(folder) df.to_feather(folder / 'abc.ftr') Pero en este caso repetiría la df.to_feather(folder / 'abc.ftr') . Esto se vuelve molesto si la declaración se hace más grande y quiero abstenerme de construir una función para esto.
Otra forma podría ser:
if folder not in os.listdir(): os.makedirs(folder) df.to_feather(folder / 'abc.ftr')¿Sería esta la forma 'adecuada' de abordar esto?
Para responder a la pregunta en el título, puede hacer esto recursivamente:
def do_stuff(x): try: stuff(x) except SpecificException: other_stuff(x) do_stuff(x)Si desea crear un archivo, simplemente puede usar:
pathlib.Path('/tmp/sub1/sub2').mkdir(parents=True, exist_ok=True)Dado python3.2 os.makedirs tiene un argumento exist_ok opcional, que de forma predeterminada es False . Cuando se establece en True y os.makedirs recibe instrucciones para crear catálogos que ya existen, no es una operación. Así en lugar de
if folder not in os.listdir(): os.makedirs(folder) df.to_feather(folder / 'abc.ftr')solo puedes hacer
os.makedirs(folder, exist_ok=True) df.to_feather(folder / 'abc.ftr')