@PosikGG

Почему Python не перемешивает список файлов?

Я написал код, чтобы программа перемешивала музыку на флешке. Она переименовывает все файлы на рандомные цифры, а потом по порядку: "1, 2, 3, ...".
Если сделать только первый этап (Переименовать в случайные цифры), то файлы перемешиваются, но когда программа переименует их по порядку (В 1, 2, 3, ...), то они возвращаются в прежний порядок.

Ту часть, которая переименовывает по порядку я удалил. Дальше не могу понять, как это сделать.

import os
import random

def rename():
    global path, i, ext, abs_file_name

    try:
        new_abs_file_name = os.path.join(path, str(i) + ext)
        os.rename(abs_file_name, new_abs_file_name)
        
    except FileExistsError:
        i = random.randint(1000, 1000000)
        rename()

path = "F:"   
path  =  rf"{path}"

i = random.randint(1000, 100000)

for file_name in os.listdir(path):
    base_name, ext = os.path.splitext(file_name)

    if ext.lower() not in ['.mp3']:
        continue

    abs_file_name = os.path.join(path, file_name)

    rename()
  • Вопрос задан
  • 133 просмотра
Решения вопроса 1
@Vindicar
Во-первых, не используй global без крайней необходимости.
Во-вторых, можно сделать в разы проще.
import glob
import os
import random

# обрабатываемый каталог
path = r'F:'
# абсолютные пути ко всем mp3 файлам в каталоге
mp3files = [os.path.abspath(filename) for filename in glob.glob(os.path.join(path, '*.mp3'))]
# перемешиваем
random.shuffle(mp3files)
# переименуем каждый файл в его номер, но с префиксом _
# это нужно чтобы не было конфликтов 
# (так как 1.mp3 уже есть в папке после предыдущего запуска программы)
for i,filename in enumerate(mp3files, 1): #нумерация с 1 а не с 0
    base = os.path.basename(filename) #имя файла
    # программа не сохранит предыдущие названия файлов. Сделать это сложнее.
    os.rename(filename, os.path.join(path, f'_{i}.mp3'))
# теперь уберём префикс - переименуем _1.mp3 в 1.mp3
for i in range(1, len(mp3files)+1): #нумерация с 1
  os.rename(os.path.join(path, f'_{i}.mp3'), os.path.join(path, f'{i}.mp3'))
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы