(第一篇文章......编程非常新)
我需要重命名一堆文件来自'这是一个文件名-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)
我仍然在学习,并且非常好奇有关完成同样事情的更有效和优雅的例子。
答案 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))