SXC88
SXC88

Reputation: 227

How to copy folder structure under another directory?

I have some questions related to copying a folder structure. In fact, I need to do a conversion of pdf files to text files. Hence I have such a folder structure for the place where I import the pdf:

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

And I would like to create the exact folder structure under "D:/g/subfolder1/subfolder2/" but without the pdf file since I need to put at this place the converted text file. So after the conversion function it gives me

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

And also I would like to add if function to make sure that under "D:/g/" the same folder structure does not exist before creating.

Here is my current code. So how can I create the same folder structure without the file?

Thank you!

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)))

Upvotes: 11

Views: 22623

Answers (3)

kumardeepakr3
kumardeepakr3

Reputation: 395

How about using 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)

The directory you want to create should not exist before calling this function. You can add a check for that.

Taken from shutil.copytree without files

Upvotes: 10

linusg
linusg

Reputation: 6439

For me the following works fine:

  • Iterate over existing folders

  • Build the structure for the new folders based on existing ones

  • Check, if the new folder structure does not exist
  • If so, create new folder without files

Code:

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!")

Documentation:

Upvotes: 22

VBB
VBB

Reputation: 1325

A minor tweak to your code for skipping pdf files:

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)))

Upvotes: 1

Related Questions