¿Cómo copiar la estructura de carpetas bajo otro directorio?

Tengo algunas preguntas relacionadas con la copia de una estructura de carpetas. De hecho, necesito hacer una conversión de archivos pdf a archivos de texto. Por lo tanto, tengo una estructura de carpetas para el lugar donde importo el pdf:

D:/f/subfolder1/subfolder2/a.pdf 

Y me gustaría crear la estructura de carpetas exacta en ” D:/g/subfolder1/subfolder2/ ” pero sin el archivo pdf ya que necesito colocar en este lugar el archivo de texto convertido. Así que después de la función de conversión me da

 D:/g/subfolder1/subfolder2/a.txt 

Y también me gustaría agregar la función if para asegurarse de que en ” D:/g/ ” no exista la misma estructura de carpetas antes de crear.

Aquí está mi código actual. Entonces, ¿cómo puedo crear la misma estructura de carpetas sin el archivo?

¡Gracias!

     import converter as c import os inputpath = 'D:/f/' outputpath = 'D:/g/' for root, dirs, files in os.walk(yourpath, topdown=False): for name in files: with open("D:/g/"+ ,mode="w") as newfile: newfile.write(c.convert_pdf_to_txt(os.path.join(root, name))) 

    Para mí lo siguiente funciona bien:

    • Iterar sobre las carpetas existentes

    • Construye la estructura para las nuevas carpetas basadas en las existentes.

    • Compruebe, si la nueva estructura de carpetas no existe
    • Si es así, crea una nueva carpeta sin archivos.

    Código:

     import os inputpath = 'D:/f/' outputpath = 'D:/g/' for dirpath, dirnames, filenames in os.walk(inputpath): structure = os.path.join(outputpath, dirpath[len(inputpath):]) if not os.path.isdir(structure): os.mkdir(structure) else: print("Folder does already exits!") 

    Documentación:

    • os.walk
    • os.mkdir
    • os.path.isdir

    ¿Qué hay de usar shutil.copytree ()?

     import shutil def ig_f(dir, files): return [f for f in files if os.path.isfile(os.path.join(dir, f))] shutil.copytree(inputpath, outputpath, ignore=ig_f) 

    El directorio que desea crear no debe existir antes de llamar a esta función. Puedes agregar un cheque para eso.

    Tomado de shutil.copytree sin archivos

    Un pequeño ajuste a tu código para saltar archivos pdf :

     for root, dirs, files in os.walk('.', topdown=False): for name in files: if name.find(".pdf") >=0: continue with open("D:/g/"+ ,mode="w") as newfile: newfile.write(c.convert_pdf_to_txt(os.path.join(root, name))) 

    Si la cadena raíz es única, esto se hace fácilmente mediante el reemplazo re.sub , y os.walk, de lo contrario, puede usar el corte en la cadena de ruta y os.join

     import re import os from os import join def _clone_dirs(self, root, new_root): """Walk through root folders and copy to new root""" for root_path, _, files in os.walk(root): new_folder = re.sub(string=root_path, pattern=root, repl=new_root) os.mkdir(new_folder) def _clone_dirs2(self, root, new_root): """Walk through root folders and copy to new root""" root_len = len(root)+1 for root_path, _, _ in os.walk(root): new_folder = path.join(new_root, root_path[root_len:]) os.mkdir(new_folder)