Переименовать несколько файлов с помощью Python - PullRequest
0 голосов
/ 02 декабря 2018

Я хотел бы переименовать следующие файлы из

l4_0_0.m4a
l4_0_1.m4a
l4_0_2.m4a
l5_0_0.m4a
l5_0_1.m4a
l5_0_2.m4a
l6_0_0.m4a
.
.
.
l11_0_2.m4a

В следующие имена

l5_0_0.m4a
l5_0_1.m4a
l5_0_2.m4a
l6_0_0.m4a
l6_0_1.m4a
l6_0_2.m4a
l7_0_0.m4a
.
.
.
l12_0_2.m4a

Я занимаюсь разработкой приложения, в котором раньше было 12 уровней, мне пришлось добавитьуровень до уровня 5 (l4_ _ ), поэтому я должен переименовать все уровни после уровня пять.уровень 5 (l4_ _ ) будет уровнем 6 (l5_ _ )

Я новичок в python и регулярных выражениях.Любая помощь будет оценена.Спасибо

Ответы [ 2 ]

0 голосов
/ 02 декабря 2018

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

#!/usr/bin/env python3

import re
import os


class NamedFile(object):
    file_mask = re.compile(r"(?P<PREFIX>l)(?P<LEVEL>\d+)_(?P<SUBLEVEL>\d+)_(?P<LOWLEVEL>\d+)\.(?P<EXTENSION>m4a)")
    file_format = "{PREFIX}{LEVEL}_{SUBLEVEL}_{LOWLEVEL}.{EXTENSION}".format

    @classmethod
    def files(cls, path):
        for f in sorted(os.listdir(path)):
            groups = cls.file_mask.match(f)
            if groups is not None:
                yield (path, f, groups.groupdict())

    @classmethod
    def new_name(cls, groups, increment):
        level = int(groups["LEVEL"]) + 1
        groups["LEVEL"] = level
        return cls.file_format(**groups)

    @classmethod
    def rename(cls, path, increment):
        for path, f, file_parts in NamedFile.files(path):
            new_filename = cls.new_name(file_parts, increment)
            abs_new = os.path.join(path, new_filename)
            abs_old = os.path.join(path, f)
            os.rename(abs_old, abs_new)


if __name__ == "__main__":
    print("===Original file names===")
    for path, f, file_parts in NamedFile.files("."):
        print(f)

    NamedFile.rename(".", 1)

    print("===New file names===")
    for path, f, file_parts in NamedFile.files("."):
        print(f)
0 голосов
/ 02 декабря 2018

Следующие должны сделать это.Запустите его в каталоге, в котором находятся эти файлы, и он создаст новые файлы в каталоге с именем out.

from os import listdir, makedirs
from os.path import exists, isfile, join
import re
import shutil

output_dir = 'out'

files = [f for f in listdir('.') if isfile(join('.', f)) and f.endswith('.m4a')]

if not exists(output_dir):
    makedirs(output_dir)

for f in files:
    level, suffix = re.match(r'^l([0-9]+)(_.+)', f).groups()
    shutil.copyfile(f, join(output_dir, 'l%d%s' % (int(level) + 1, suffix)))

Результат:

$ ls
l4_0_0.m4a  l4_0_1.m4a  l4_0_2.m4a  l5_0_0.m4a  l5_0_1.m4a  l5_0_2.m4a  rename.py

$ python rename.py
$ ls out
l5_0_0.m4a  l5_0_1.m4a  l5_0_2.m4a  l6_0_0.m4a  l6_0_1.m4a  l6_0_2.m4a
...