Переименование файлов по соглашению - все в папке - PullRequest
0 голосов
/ 10 сентября 2011

Я часто нахожусь в ситуации, когда у меня есть папка, содержащая файлы с именами в соответствии с определенным соглашением об именах файлов, и мне приходится просматривать их вручную, чтобы переименовать в ту, которую я хочу. Трудоемкое повторяющееся задание.

например. 01_artist_name_-_album_title_-_song_title_somethingelse.mp3 -> Song_Title.mp3

Таким образом, удаление определенных битов информации, замена подчеркивания пробелами и использование заглавных букв. Не только для музыки, это просто пример.

Я думал об автоматизации этой задачи с использованием Python. По сути, я хочу иметь возможность ввести начальное соглашение и мое требуемое соглашение и переименовать их все соответствующим образом.

В идеале я хочу иметь возможность делать это в Python для Windows, но у меня есть машина с Ubuntu, которую я мог бы использовать для этого, если бы это было проще сделать в bash (или Python в UNIX).

Если кто-то может пролить свет на то, как я мог бы подойти к этой проблеме (предложение команд Python IO, которые читают содержимое папки - и переименовывают файлы - в Windows, и как я мог бы извлечь информацию из имени файла и классифицировать ее , может быть, с помощью RegEx?) Я посмотрю, что я могу сделать, и обновлять с прогрессом.

1 Ответ

1 голос
/ 10 сентября 2011

Для вашего особого случая:

import  glob, shutil, os.path

# glob.glob returns a list with all pathes according to the given pattern 
for path in glob.glob("music_folder/*.mp3"):

     # os.path.dirname gives the directory name, here it is "music_folder"
     dirname = os.path.dirname(path)

     # example: 01_artist_name_-_album_title_-_song_title_somethingelse.mp3
     # split returns "_song_title_somethingelse.mp3"
     interesting = path.split("-")[2]

     # titlepart is a list with ["song", "title"], the beginning "_" and the
     # 'somehting' string is removed by choosing the slice 1:-1
     titlepart = interesting.split("_")[1:-1]

     # capitalize converts song -> Song, title -> title
     # join gluest both to "Song_Title"
     new_name = "_".join(p.capitalize() for p in titlepart)+".mp3"

     # shutil.move renames the given file
     shutil.move(path, os.path.join(dirname, new_name))

Если вы хотите использовать регулярное выражение, вы должны заменить:

     m=re.search(".*-_(\S+_\S+)_.*",path)
     if m is None:
        raise Exception("file name does not match regular expression")
     song_name = m.groups()[0]
     titlepart = song_name.split("_")
...