【问题标题】:How can i compare files names in python? [closed]如何比较python中的文件名? [关闭]
【发布时间】:2019-07-10 21:15:44
【问题描述】:

我已经厌倦了用字幕重命名每一集(我有 100 多个)

如果两个文件的名称中包含相同的剧集编号,我如何比较这两个文件,然后我希望它将字幕替换为剧集名称

我尝试自己做,我成功地更改了名称(简单),但比较部分是我所缺少的。

谢谢。

已编辑:

文件名是这样的;

(剧集):[PuyaSubs!] 香蕉鱼 - 12 [1080p].mkv

(字幕):香蕉鱼 - 12.ass

到目前为止我想出了什么:

import os
old_file = os.path.join(r"D:\Downloads\Media\Anime\[PuyaSubs!] Banana Fish [1080p][Batch]\Banana Fish - 12.ass", "Banana Fish - 12.ass")
new_file = os.path.join(r"D:\Downloads\Media\Anime\[PuyaSubs!] Banana Fish [1080p][Batch]\Banana Fish - 12.ass", "[PuyaSubs!] Banana Fish - 12 [1080p][2ECC9207].ass")
os.rename(old_file, new_file)

这只会更改名称,但它不是自动的,我必须手动为每个字幕文件这样做。

【问题讨论】:

  • 请向我们展示您目前拥有的东西,以便我们帮助您找出问题所在。
  • 举例说明这两个文件的样子?
  • 第一个文件(动画剧集):[PuyaSubs!] Banana Fish - 01 [1080p][EBD2A650].mkv 第二个(字幕):Banana Fish - 11 .ass
  • 您可以使用regex(正则表达式)将文件名拆分为多个部分,例如节目名称和剧集编号,然后对它们进行操作。
  • 当然,上一集的字幕应该是这样的Banana Fish - 01 .ass .. 对吧?

标签: python file operating-system


【解决方案1】:

我是这样看的:

我是如何实现的:

  1. 首先使用os.listdir获取目录下所有文件的列表
  2. 接下来我们遍历每个文件,如果它包含.ass 后缀(这意味着它是一个字幕文件)
  3. 然后我们查看整个文件目录,看看是否有与字幕文件匹配的电影。我们在 try 语句中执行此操作,这使我们能够突破 for 循环,以免出现任何错误。
  4. 最后我们只需要重命名字幕文件名,为此我们使用os.rename
#!/usr/bin/env python3

import os, re

def fixMySubtitles(mediaFolderPath):
    # Lists all the files in the folder
    files = os.listdir(mediaFolderPath)

    # Loops through every single file in the directory
    for file in files:
        # In the beginning we set both names to "" since we don't know what they are yet.
        movie = ""
        subtitle = ""

        # If searches the current file name to see if it ends in .ass
        if re.search(r'\.ass', file):
            # This removes the .ass part from the subtitle name
            subtitle = re.search(r'(.*).ass', file).group(1)

            # This chunk matches the subtitle file to the movie file
            movie = [movie for movie in files if subtitle in movie]
            movie = [movie for movie in movie if '.mkv' in movie]
            movie = "".join(movie)

            # Now we try to get the movie without the .mkv part
            try:
                movie = re.search(r'(.*).mkv', movie).group(1)
            except:
                print("Movie not found error for subtitle '%s'" % (file))
                break

            # Lastly we can set the path of the new subtitle file
            newPath = os.path.join(mediaFolderPath, "%s.ass" % (movie))

            # And if the movie variable has a value then we can rename
            if movie:
                os.rename(os.path.join(mediaFolderPath, file), newPath)

    print("I have fixed your subtitles!")

如何运行

我现在实际上是在 Mac 上,但这应该仍然可以在 Windows 上运行。

  1. 运行此程序时,您需要一个包含代码的 python 文件。
  2. 一旦您在内部准备好此代码,您将需要实际调用该方法,因为现在我们已经使用def 创建函数(函数/方法可以互换使用)但是我们实际上并没有在任何地方运行该函数
  3. 在代码的底部添加一行
    fixMySubtitles("[DIRECTORY OF FOLDER WITH MEDIA]") 并将[DIRECTORY OF FOLDER...] 替换为您的文件夹路径
  4. 最后你应该能够运行文件了 python.exe [PATH TO PYTHON FILE]

作为参考,这是我文件中的确切代码:

#!/usr/bin/env python3

import os, re

def fixMySubtitles(mediaFolderPath):
    files = os.listdir(mediaFolderPath)

    for file in files:
        movie = ""
        subtitle = ""
        if re.search(r'\.ass', file):
            subtitle = re.search(r'(.*).ass', file).group(1)
            movie = [movie for movie in files if subtitle in movie]
            movie = [movie for movie in movie if '.mkv' in movie]
            movie = "".join(movie)
            try:
                movie = re.search(r'(.*).mkv', movie).group(1)
            except:
                print("Movie not found error for subtitle '%s'" % (file))
            newPath = os.path.join(mediaFolderPath, "%s.ass" % (movie))
            if movie:
                os.rename(os.path.join(mediaFolderPath, file), newPath)

    print("I have fixed your subtitles!")

fixMySubtitles("/Users/My_User/Desktop/test")

希望这会有所帮助!

【讨论】:

  • 嗨,我应该在代码中更改什么(比如目录?)而且我是 python 新手,所以我不知道“$”是什么意思和其他功能。如果你能进一步解释它会很有帮助,提前谢谢你:D
  • 嘿,@VXsz 你介意告诉我你使用的是 Mac 还是 Windows?
  • Windows 10,顺便说一句,从未使用过 Mac
  • 好的,我已经添加了一些 cmets,我将添加另一个部分来帮助您运行该方法
  • 我已经阅读了它,现在我理解起来好多了,最后一个问题......我应该更改“mediaFolderPath”还是其他什么?
【解决方案2】:

这是我的解决方案... 将变量 inDir 分配给你的文件路径,我认为是 D:\Downloads\Media\Anime

import os
import re
from glob import glob

inDir = "D:\Downloads\Media\Anime"

lst = glob(os.path.join(inDir, r"*.ass"))
for filepath in lst:
    parent, filename = os.path.split(filepath)
    episode = re.findall(r"Banana Fish - (\d+).ass", filename)[0]
    newName = "[PuyaSubs!] Banana Fish - {} [1080p][2ECC9207].ass".format(episode)
    os.chdir(parent)
    os.rename(filename, newName)

【讨论】:

  • 试过了,没用...,我尝试自己修改代码,但仍然没有成功...如果您有时间可以解释一下代码
  • 我编辑了我的代码,再试一次!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-22
  • 1970-01-01
  • 2016-07-16
  • 2020-10-06
  • 2020-12-20
  • 2019-01-03
相关资源
最近更新 更多