使用python重命名多个文件

时间:2018-12-02 02:24:49

标签: python regex file rename

我想从

重命名以下文件
function Cats($name, $wrongCatlist, &$allCats, $Catlist) {

    $Cats = getCats($Catlist, $name);
    $Cats2 = array_unique ( $Cats );
    $Cats3 = '"'.implode('", "', $Cats2).'"'; 
    array_push($allCats, $Cats3);
}

使用以下名称

function Cats($name, $wrongCatlist, $allCats, $Catlist) {

    $Cats = getCats($Catlist, $name);
    $Cats2 = array_unique ( $Cats );
    $Cats3 = '"'.implode('", "', $Cats2).'"'; 
    array_push($allCats, $Cats3);
    return $allCats;
}

$allCats = Cats($name, $wrongCatlist, $allCats, $Catlist);

我正在开发一个具有12个级别的应用程序,我必须在5级之前添加一个级别(l4_ _ ),因此,我必须重命名5级之后的所有级别。 级别5(l4_ _ )将是级别6(l5_ _

我是python和正则表达式的新手。任何帮助将不胜感激。 谢谢

2 个答案:

答案 0 :(得分:2)

使用带有符号组名的正则表达式将使您能够轻松访问要操作的文件名部分。我使用了一个类,因为我认为您可能想在重命名过程中添加其他功能,例如子级别或最低级别。

#!/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)

答案 1 :(得分:1)

下面应该这样做。在这些文件所在的目录中运行它,它将在名为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