pythonpython-3.xfileoperating-systemshutil

shutil moving only one file instead of many files in a directory


I wrote a code which moves the files which has a substring in them.

import os
import shutil

def move():
    path = os.getcwd()
    shutil.rmtree('Animals')
    firstfolder = 'Animals'
    if not os.path.isdir(firstfolder):
        os.mkdir('Animals')

    for file in os.listdir():
        Buffalo = '1837'
        donkey = '6104'
        Chimpanzee = '9731'
        cat = '2905'
        rat = '6648'
        sheep = '3128'
        lizard = '3053'
        insect = '2681'
        dog = '3901'
        #Buffalo
        if Buffalo in file:
            secondfolder = 'Animals/Buffalo'
            thirdfolder = 'Animals/Buffalo/testfolder'
            if not os.path.isdir(secondfolder):
                os.mkdir(secondfolder)
            if not os.path.isdir(thirdfolder):
                os.mkdir(thirdfolder)
                shutil.move(file, thirdfolder)
        #donkey
        if donkey in file:
            secondfolder = 'Animals/donkey'
            thirdfolder = 'Animals/donkey/testfolder'
            if not os.path.isdir(secondfolder):
                os.mkdir(secondfolder)
            if not os.path.isdir(thirdfolder):
                os.mkdir(thirdfolder)
                shutil.move(file, thirdfolder)
        #Chimpanzee
        if Chimpanzee in file:
            secondfolder = 'Animals/Chimpanzee'
            thirdfolder = 'Animals/Chimpanzee/testfolder'
            if not os.path.isdir(secondfolder):
                os.mkdir(secondfolder)
            if not os.path.isdir(thirdfolder):
                os.mkdir(thirdfolder)
                shutil.move(file, thirdfolder)
        #cat
        if cat in file:
            secondfolder = 'Animals/cat'
            thirdfolder = 'Animals/cat/testfolder'
            if not os.path.isdir(secondfolder):
                os.mkdir(secondfolder)
            if not os.path.isdir(thirdfolder):
                os.mkdir(thirdfolder)
                shutil.move(file, thirdfolder)

        #rat
        if rat in file:
            secondfolder = 'Animals/rat'
            thirdfolder = 'Animals/rat/testfolder'
            if not os.path.isdir(secondfolder):
                os.mkdir(secondfolder)
            if not os.path.isdir(thirdfolder):
                os.mkdir(thirdfolder)
                shutil.move(file, thirdfolder)
        #sheep
        if sheep in file:
            secondfolder = 'Animals/sheep'
            thirdfolder = 'Animals/sheep/testfolder'
            if not os.path.isdir(secondfolder):
                os.mkdir(secondfolder)
            if not os.path.isdir(thirdfolder):
                os.mkdir(thirdfolder)
                shutil.move(file, thirdfolder)
        #lizard
        if lizard in file:
            secondfolder = 'Animals/lizard'
            thirdfolder = 'Animals/lizard/testfolder'
            if not os.path.isdir(secondfolder):
                os.mkdir(secondfolder)
            if not os.path.isdir(thirdfolder):
                os.mkdir(thirdfolder)
                shutil.move(file, thirdfolder)
        #insect
        if insect in file:
            secondfolder = 'Animals/insect'
            thirdfolder = 'Animals/insect/testfolder'
            if not os.path.isdir(secondfolder):
                os.mkdir(secondfolder)
            if not os.path.isdir(thirdfolder):
                os.mkdir(thirdfolder)
                shutil.move(file, thirdfolder)
        #dog
        if dog in file:
            secondfolder = 'Animals/dog'
            thirdfolder = 'Animals/dog/testfolder'
            if not os.path.isdir(secondfolder):
                os.mkdir(secondfolder)
            if not os.path.isdir(thirdfolder):
                os.mkdir(thirdfolder)
                shutil.move(file, thirdfolder)



move()

In my Current Working Directory, i have these files: 1):- 2905r20.wav 2):- 5fm2905.wav 3):- nso2905.wav 4):-1sny2905wn3i56.wav

When i Run the Code, it is only moving the last file which is 1sny2905wn3i56.wav. It is Not Moving all the files which has 2905 in them. It Should move all 4 files. but i don't know why it is only moving last file. When I Run the Code again after moving the last file, it is moving 3rd file and deleting 4th file which was moved. And When i run the code again, it is deleting 3rd file and moving 2nd file and so on...

how to fix that ??


Solution

  • import os
    import shutil
    
    def move():
        path = os.getcwd()
        shutil.rmtree('Animals')
        firstfolder = 'Animals'
        if not os.path.isdir(firstfolder):
            os.mkdir('Animals')
    
        # Collect files to move
        files_to_move = []
        for file in os.listdir():
            if '2905' in file:  # Modify this condition as per your needs
                files_to_move.append(file)
    
        # Move collected files to their respective folders
        for file in files_to_move:
            if '2905' in file:  # Modify this condition as per your needs
                animal_name = file.split('2905')[0]  # Extract animal name dynamically
                secondfolder = f'Animals/{animal_name}'
                thirdfolder = f'Animals/{animal_name}/testfolder'
    
                if not os.path.isdir(secondfolder):
                    os.makedirs(secondfolder)  # Use makedirs to create parent directories if needed
                if not os.path.isdir(thirdfolder):
                    os.makedirs(thirdfolder)  # Use makedirs to create parent directories if needed
    
                shutil.move(file, thirdfolder)
    
    move()
    

    By Simply Iterating over os.listdir(), the problem is solved.

    use os.makedirs() instead of os.mkdir() to create multiple directories. This prevents issues where shutil.move() fails due to missing directories.

    Adjust the conditions ('2905' in file and folder) as per your actual requirements.