Перемещение файлов .mp3 в папки, пытаясь создать существующую папку, когда она соответствует условиям для существующей папки - PullRequest
0 голосов
/ 27 апреля 2020

Я пытаюсь создать программу, которая считывает несколько файлов c в массив. И исходя из их жанра (в метаданных), переместите их в соответствующую папку (т.е. домашний трек будет go в домашнюю папку). Если папка для этого жанра не существует, она должна создать папку для этого файла и для будущих.

Проблема возникает при попытке создать уже существующую папку, даже если эта существующая папка является правильной. В чем проблема? Новое в перемещении папок / файлов, поэтому любые советы будут с благодарностью приняты

music = os.path.join(home, 'Music')

print(music)

# Function that checks if directory exists
def directory_check(home, folder):
    folder_path = os.path.join(home, folder)
    folder_check = os.path.isdir(folder_path)
    if folder_check is True:
        print(folder_path + " is a valid directory")
    else:
        print(folder_path + " is NOT a valid directory")

directory_check(home, downloads)
directory_check(home, documents)
directory_check(home, pictures)
directory_check(home, desktop)
directory_check(home, music)

tracks = []
genres = []

for root, dirs, files, in os.walk(downloads):
    for name in files:
        if name.endswith((".mp3", ".m4a", ".wav")):
            shutil.move(downloads + '\\' + name,
                        music + '\\Tracks' + '\\' + name)


for root, dirs, files, in os.walk(music + '\\Tracks'):
    genres.extend(dirs);
    for name in files:
        if name.endswith((".mp3", ".wav", "m4a")):
            tracks.append(name)
            track = TinyTag.get(music + "\\Tracks\\" + name);


print(genres);

for track in tracks:

path = music + '\Tracks\\' + track;
temp = TinyTag.get(path);

for i in genres:
    if temp.genre == i:
        shutil.move(music + '\Tracks\\' + track,
                    music + '\Tracks\\' + i + '\\' + track)


    elif temp.genre == "" or temp.genre == None:
        shutil.move(music + '\Tracks\\' + track,
                    music + '\Tracks\Misc\\' + track)

    else:
        path = os.getcwd()
        os.makedirs(path + '\\' + temp.genre)
        shutil.move(path + '\\' + track, path +
                    '\\' + temp.genre + '\\' + track )

Это ошибка

Traceback (most recent call last):
  File "C:\Users\callu\Music\File~org.py", line 83, in <module>
    os.makedirs(path + '\\' + temp.genre)
  File "C:\Users\callu\AppData\Local\Programs\Python\Python37-32\lib\os.py", line 221, in makedirs
    mkdir(name, mode)
FileExistsError: [WinError 183] Cannot create a file when that file already exists: 'C:\\Users\\callu\\Music\\House'

Большое спасибо.

1 Ответ

0 голосов
/ 27 апреля 2020

см. os.makedirs

, если вы используете:

os.makedirs(path + '\\' + temp.genre, exist_ok=True) 

для функции все в порядке, когда каталог уже существует.

Обратите внимание, что «македиры» могут создавать несколько каталогов, когда дерево не корректно. Поэтому, если вы хотите создать «C: \ Users \ Tom \ Music \ Hardrock», а каталог «Tom» не существует, он будет создан как «Musi c» и «Hardrock». Таким образом, все дерево создается. Если вам не нужно это поведение, вы должны использовать os.mkdir с попыткой перехвата для FileExistsError.

У вас есть проблемы в вашем последующем коде:

for root, dirs, files, in os.walk(music + '\\Tracks'):
    for genre_name in dirs:
        # this is getting executed for every subfolder.
        genres.extend(genre_name);
    for name in files:
        if name.endswith((".mp3", ".wav", "m4a")):
            tracks.append(name)
            # track = TinyTag.get(music + "\\Tracks\\" + name);
            # this is not neccessary


print(genres);

for track in tracks:
    path = music + '\Tracks\\' + track;
    temp = TinyTag.get(path);

    if temp.genre == "" or temp.genre == None:
        # not detected genre
        shutil.move(path, music + '\Tracks\Misc\\' + track)
        continue

    if temp.genre is in genres:
        # no need of creating new directories
        shutil.move(path, music + '\Tracks\\' + temp.genre + '\\' + track)
        continue

    # we come to here because the genre of the track is new
    # path = os.getcwd()  # why this?
    os.makedirs(music + '\Tracks\\' + temp.genre, exist_ok=True)
    shutil.move(path, music + '\Tracks\\' + temp.genre + '\\' + track)

РЕДАКТИРОВАТЬ: исправил мой ответ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...