如何重命名与正则表达式匹配的每个文件?

How can I rename every file that matches a regex?

我想将 xyz.ogg.mp3 形式的文件名重命名为 xyz.mp3

我有一个在每个文件中查找 .ogg 的正则表达式,然后它将 .ogg 替换为空字符串,但我收到以下错误:

Traceback (most recent call last):
  File ".\New Text Document.py", line 7, in <module>
    os.rename(files, '')
TypeError: rename() argument 1 must be string, not _sre.SRE_Match

这是我尝试过的:

for file in os.listdir("./"):
    if file.endswith(".mp3"):
        files = re.search('.ogg', file)
        os.rename(files, '')

如何让这个循环查找每个文件中的每个 .ogg 然后用空字符串替换它?

文件结构如下所示:audiofile.ogg.mp3

你可以这样做:

for file in os.listdir("./"):
    if file.endswith(".mp3") and '.ogg' in file:
        os.rename(file, file.replace('.ogg',''))

编写命令行会快得多:

rename 's/\.ogg//' *.ogg.mp3

(perl 的重命名)

一个使用 Python 3's pathlib 的示例(但不是正则表达式,因为它对所述问题有点矫枉过正):

from pathlib import Path
for path in Path('.').glob('*.mp3'):
    if '.ogg' in path.stem:
        new_name = path.name.replace('.ogg', '')
        path.rename(path.with_name(new_name))

一些注意事项:

  • Path('.') 给你一个 Path 指向当前工作目录的对象
  • Path.glob() 递归搜索, * 有一个通配符(所以你得到任何以 .mp3 结尾的东西)
  • Path.stem 为您提供减去扩展名的文件名(因此,如果您的路径是 /foo/bar/baz.bang,则主干将是 baz