пакетный поиск и замена строк в именах файлов на python - PullRequest
1 голос
/ 23 октября 2011

Я пытаюсь написать небольшой скрипт на python, чтобы переименовать группу имен файлов путем поиска и замены. Например:

Исходное имя файла: MyMusic.Songname.Artist-mp3.iTunes.mp3

Intendet Результат: Songname.Artist.mp3

, что я получил до сих пор:

#!/usr/bin/env python
from os import rename, listdir

mustgo = "MyMusic."
filenames = listdir('.')

for fname in fnames:
  if fname.startswith(mustgo):
    rename(fname, fname.replace(mustgo, '', 1))

(получил, насколько я помню, с этого сайта)

В любом случае, это только избавит от строки в начале, но не от тех, которые указаны в имени файла.

Также я хотел бы, возможно, использовать отдельный файл (например, badwords.txt), содержащий все строки, которые необходимо найти и заменить, чтобы я мог обновить их без необходимости редактирования всего кода.

Content of badwords.txt
MyMusic.
-mp3
-MP3
.iTunes
.itunes

Я долго искал, но ничего не нашел. Буду признателен за любую помощь!

Спасибо!

1 Ответ

3 голосов
/ 23 октября 2011
import fnmatch
import re    
import os

with open('badwords.txt','r') as f:
    pat='|'.join(fnmatch.translate(badword)[:-1] for badword in 
                 f.read().splitlines())   

for fname in os.listdir('.'):
    new_fname=re.sub(pat,'',fname)
    if fname != new_fname:
        print('{o} --> {n}'.format(o=fname,n=new_fname))
        os.rename(fname, new_fname)

# MyMusic.Songname.Artist-mp3.iTunes.mp3 --> Songname.Artist.mp3
  • Обратите внимание, что некоторые файлы могут быть перезаписаны (и, следовательно, потеряны), если два имени будут сокращены до одного сокращенного имени после удаления badwords.Набор новых имен можно сохранить и проверить перед вызовом os.rename, чтобы предотвратить потерю данных при столкновении имен.
  • fnmatch.translate принимает шаблоны в стиле оболочки и возвращает эквивалентное регулярное выражение.Он используется выше для преобразования плохих слов (например, '.iTunes') в регулярные выражения (например, r'\.iTunes').
  • Ваш список плохих слов указывает на то, что вы хотите игнорировать регистр.Вы можете игнорировать регистр, добавив '(?i)' к началу pat:

    with open('badwords.txt','r') as f:
       pat='(?i)'+'|'.join(fnmatch.translate(badword)[:-1] for badword in 
                           f.read().splitlines())
    
...