Home > Software design >  Python script to move specific filetypes from the all directories to one folder
Python script to move specific filetypes from the all directories to one folder

Time:12-21

I'm trying to write a python script to move all music files from my whole pc to one spcific folder. They are scattered everywhere and I want to get them all in one place, so I don't want to copy but completely move them.

I was already able to make a list of all the files with this script:

import os

targetfiles = []
extensions = (".mp3", ".wav", ".flac")

for root, dirs, files in os.walk('/'):
    for file in files:
        if file.endswith(extensions):
            targetfiles.append(os.path.join(root, file))
print(targetfiles)

This prints out a nice list of all the files but I'm stuck to now move them.

I did many diffent tries with different code and this was one of them:

import os
import shutil

targetfiles = []
extensions = (".mp3", ".wav", ".flac")

for root, dirs, files in os.walk('/'):
    for file in files:
        if file.endswith(extensions):
            targetfiles.append(os.path.join(root, file))

new_path = 'C:/Users/Nicolaas/Music/All'   file
shutil.move(targetfiles, new_path)

But everything I try gives me an error:

TypeError: rename: src should be string, bytes or os.PathLike, not list

I think I've met my limit gathering this all as I'm only starting at Python but I would be very grateful if anyone could point me in the right direction!

CodePudding user response:

You are trying to move a list of files to a new location, but the shutil.move function expects a single file as the first argument. To move all the files in the targetfiles list to the new location, you have to use a loop to move each file individually.

for file in targetfiles:
    shutil.move(file, new_path)

Also if needed add a trailing slash to the new path 'C:/Users/Nicolaas/Music/All/'

On a sidenote are you sure that moving all files with those extentions is a good idea? I would suggest copying them or having a backup.

Edit: You can use an if statement to exclude certain folders from being searched.

for root, dirs, files in os.walk('/'):
    if any(folder in root for folder in excluded_folders):
        continue
    for file in files:
        if file.endswith(extensions):
            targetfiles.append(os.path.join(root, file))

Where excluded_folder is a list of the unwanted folders like: excluded_folders = ['Program Files', 'Windows']

CodePudding user response:

I would suggest using glob for matching:

import glob


def match(extension, root_dir):
    return glob.glob(f'**\\*.{extension}', root_dir=root_dir, recursive=True)


root_dirs = ['C:\\Path\\to\\Albums', 'C:\\Path\\to\\dir\\with\\music\\files']
excluded_folders = ['Bieber', 'Eminem']
extensions = ("mp3", "wav", "flac")

targetfiles = [f'{root_dir}\\{file_name}' for root_dir in root_dirs for extension in extensions for file_name in match(extension, root_dir) if not any(excluded_folder in file_name for excluded_folder in excluded_folders)]

Then you can move these files to new_path

  • Related