Как я могу переименовать каждый файл, который соответствует регулярному выражению? - PullRequest
0 голосов
/ 11 января 2020

Я хочу переименовать имена файлов в форме xyz.ogg.mp3 в xyz.mp3.

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

Traceback (most recent call last):
  File ".\New Text Document.py", line 7, in <module>
    os.rename(files, '')
TypeError: rename() argument 1 must be string, not _sre.SRE_Match

Вот что я пробовал:

for file in os.listdir("./"):
    if file.endswith(".mp3"):
        files = re.search('.ogg', file)
        os.rename(files, '')

Как я могу заставить этот l oop искать каждый .ogg в каждом файле и затем заменить это с пустой строкой?

Структура файла выглядит следующим образом: audiofile.ogg.mp3

Ответы [ 3 ]

1 голос
/ 11 января 2020

Вы можете сделать что-то вроде этого:

for file in os.listdir("./"):
    if file.endswith(".mp3") and '.ogg' in file:
        os.rename(file, file.replace('.ogg',''))
0 голосов
/ 11 января 2020

Пример использования Python 3's pathlib (но не регулярных выражений, так как это своего рода излишество для указанной проблемы):

from pathlib import Path
for path in Path('.').glob('*.mp3'):
    if '.ogg' in path.stem:
        new_name = path.name.replace('.ogg', '')
        path.rename(path.with_name(new_name))

Несколько замечаний:

  • Path('.') дает вам объект Path, указывающий на текущий рабочий каталог
  • Path.glob() рекурсивный поиск, а * - это подстановочный знак (так что вы получаете что-нибудь оканчивающийся на .mp3)
  • Path.stem дает вам имя файла за вычетом расширения (поэтому, если ваш путь был /foo/bar/baz.bang, стебель будет baz)
0 голосов
/ 11 января 2020

Было бы гораздо быстрее написать командную строку:

rename 's/\.ogg//' *.ogg.mp3

(переименование perl)

...