(初学者)使用Python重命名文件 - 重构以获得更好的答案

时间:2016-01-13 23:14:55

标签: python file rename

(第一篇文章......编程非常新)

我需要重命名一堆文件来自'这是一个文件名-123456.ext'到' 123456 - 这是一个filename.ext'

我设法使用Python解决了下面的代码问题。我不得不制作2个脚本,因为有时会有5个数字,但大部分都是6个。

import os
for filename in os.listdir('.'): #not sure how to rename recursive sub-directories
    if filename != 'ren6.py': #included to not rename the script file
        start = filename[:-11]
        number = filename[-10:-4]
        ext = filename[-4:]
        newname = str(number) + '-' + str(start)+str(ext) #Unnecessary variable creation?
        os.rename(filename,newname)

我仍然在学习,并且非常好奇有关完成同样事情的更有效和优雅的例子。

2 个答案:

答案 0 :(得分:4)

使用正则表达式可能更安全,更强大。这只会重命名与给定模式匹配的文件,即[任何字符序列] [A DASH] [NUMBERS] [EXTENSION]

使用此方法的另一个好处是,您可以在同一目录上多次运行它,但它不会影响已重命名的文件。

您可能还需要进行检查,以确保您重命名的文件不存在(这样您就不会覆盖现有文件)。

import re


for filename in os.listdir('.')
    m = re.match(r'^(?P<name>.+)-(?P<num>\d+)(?P<ext>\.\w+)$', filename)
    if m:
        newname = '{num}-{name}{ext}'.format(**m.groupdict())
        if not os.path.exists(newname):
            os.rename(filename, newname)

我打破了正则表达式

^(?P<name>.+)

^表示我们将在文件名的开头匹配(而不是匹配文件名的中间部分)。 ()使其成为正则表达式组,以便我们只能访问字符串匹配的那一部分。 ?P<name>只是将标签应用于特定组的一种方式,以便我们稍后可以通过名称将其引用。在这种情况下,我们为此群组提供了name的标签。

.会匹配任何字符,+会告诉它匹配1个或多个字符。

-

这只会匹配-字符

(?P<num>\d+)

同样,我们已将此作为一个群组,并为其指定了num的标签。 \d只匹配数字,+表示匹配1个或更多数字。

(?P<ext>\.\w+)$

另一组,另一个标签。 \.仅匹配.\w将匹配单词字符(即字母,数字,下划线)。同样,+表示它将匹配1个或多个字符。 $确保它一直匹配到字符串的结尾。

答案 1 :(得分:1)

这个怎么样?

import os

for filename in os.listdir('.')
    name, extension = os.path.splitext(filename)
    if '-' not in name:
        continue
    part1, part2 = filename.split('-')
    os.rename(filename, "{1}-{0}{2}".format(part2, part1, extension))