Как перебирать файлы и переименовывать их в Python

#python #filesystems #directory-traversal

#python #файловые системы #обход каталогов

Вопрос:

У меня есть каталог музыки, в котором есть папки с альбомами, а также отдельные песни на каждом уровне. Как я могу просмотреть все эти файлы, которые также закодированы в разных форматах (mp3, wav и т. Д.)? Кроме того, есть ли способ, которым я могу переименовать их в формат, который более соответствует моему вкусу, используя регулярные выражения?

Спасибо

Комментарии:

1. Я обычно беру деньги за кодирование чего-то подобного. Вот что-то похожее, что я написал в perl, вы можете хотя бы увидеть приблизительную идею: github.com/eberle1080/oggsync

2. @Chris: ой, 300 строк Perl для обхода и переименования файлов?

3. Нет, 300 строк для перекодирования из одного формата в другой. Разве это не то, что было после операции?

4. @Chris: Я думаю, вам следует прочитать вопрос 🙂

5. Да, упс. Мой плохой. Я прочитал это неправильно.

Ответ №1:

  • os.walk чтобы просмотреть файлы в каталоге и его подкаталогах, рекурсивно
  • os.rename чтобы переименовать их

Я думаю, что кодирование файлов здесь не играет никакой роли. Вы, конечно, можете определить их расширение (использовать os.path.splitext для этого) и сделать что-то на его основе, но пока вам просто нужно переименовывать файлы (т. Е. Манипулировать их именами), Содержимое вряд ли имеет значение.

Ответ №2:

Я использую этот фрагмент кода в программе, которую я написал. Я использую его для получения рекурсивного списка файлов изображений, шаблон вызова выглядит примерно так re.compile(r'.(bmp|jpg|png)$', re.IGNORECASE) . Я думаю, вы поняли идею.

 def getFiles(dirname, suffixPattern=None):
        dirname=os.path.normpath(dirname)

        retDirs, retFiles=[], []
        for root, dirs, files in os.walk(dirname):
                for i in dirs:
                        retDirs.append(os.path.join(root, i))
                for i in files:
                        if suffixPattern is None or 
                           suffixPattern.search(i) is not None:
                                retFiles.append((root, i))

        return (retDirs, retFiles)
 

После того, как у вас будет список, будет легко применить правило переименования. os.rename ваш друг, смотрите http://docs.python.org/library/os.html .