【问题标题】:(Beginner) Rename file using Python - Refactor for a better answer(初学者)使用 Python 重命名文件 - 重构以获得更好的答案
【发布时间】:2016-04-19 03:31:26
【问题描述】:

(第一篇文章...对编程非常陌生)

我需要将一堆文件从“这是一个文件名-123456.ext”重命名为“123456-这是一个文件名.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)

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

【问题讨论】:

  • 文件名是否与中间的连字符一致(a-bb-a)?
  • 你能提供一个示例文件名吗?
  • 我在原始问题中提供了一个示例-“这是所有文件都在-123456.txt 中的文件名模式”...我想将其更改为“123456-这是所有文件都在.txt中的文件名模式” ...所有文件都以这种方式标题-123456.txt

标签: python file rename


【解决方案1】:

使用正则表达式可能更安全、更强大。这只会重命名与给定模式匹配的文件,即 [ANY SEQUENCE OF CHARACTERS][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&lt;name&gt; 只是将标签应用于特定组的一种方式,以便我们稍后可以通过名称引用它。在这种情况下,我们给这个组一个标签name

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

-

这只会匹配- 字符

(?P<num>\d+)

再一次,我们已将其设为一个组,并为其赋予标签num\d 只会匹配数字,+ 表示它将匹配 1 个或多个数字。

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

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

【讨论】:

  • 嗯...我喜欢确保我没有创建相同的文件名的想法,但是我需要一些时间来理解它是如何工作的。在这种特殊情况下,每个 6 或 5 位数字都是唯一的,但肯定是采用的最佳实践。谢谢。
  • 我会将正则表达式添加到我的学习轨迹中。我认为这可能在许多领域都非常强大和方便。谢谢。
【解决方案2】:

这个怎么样?

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))

【讨论】:

  • 以我目前的水平......我可以按照这个逻辑。很酷。我没有考虑将文件名拆分为变量。
  • 我注意到一个重要的缺点是这个方法不是idempotent——在文件名已经重命名的目录上运行它会将它们重命名为旧的、不需要的名称。
  • 我使用的代码也没有考虑到这一点......而且我确实意识到每次后续运行都会迭代文件名。我一直小心不要运行它,除了一次,因为没有撤消。嗯...撤消会很好。
猜你喜欢
  • 1970-01-01
  • 2019-05-30
  • 1970-01-01
  • 2021-10-23
  • 1970-01-01
  • 2018-07-19
  • 1970-01-01
  • 2022-01-22
  • 2013-08-24
相关资源
最近更新 更多