Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何编写程序重命名mp4文件以匹配srt文件的名称?_C++_Python_Algorithm_File Rename - Fatal编程技术网

C++ 如何编写程序重命名mp4文件以匹配srt文件的名称?

C++ 如何编写程序重命名mp4文件以匹配srt文件的名称?,c++,python,algorithm,file-rename,C++,Python,Algorithm,File Rename,所以我从Coursera下载了“计算机网络入门”课程的mp4和srt文件。但mp4和srt文件的名称之间存在细微差异 文件名示例如下: 1-1-1-1目标和动机(1253).mp4 1-1-1-1目标和动机(1253)。srt 1-2-1-2网络的使用(1316).mp4 1-2-1-2网络的使用(13_16).srt 1-3-1-3网络组件(1330).mp4 1-3-1-3网络组件(13_30).srt 1-4-1-4插座(1407).mp4 1-4-1-4插座(14_07).srt 1-5

所以我从Coursera下载了“计算机网络入门”课程的mp4和srt文件。但mp4和srt文件的名称之间存在细微差异

文件名示例如下:

1-1-1-1目标和动机(1253).mp4
1-1-1-1目标和动机(1253)。srt
1-2-1-2网络的使用(1316).mp4
1-2-1-2网络的使用(13_16).srt
1-3-1-3网络组件(1330).mp4
1-3-1-3网络组件(13_30).srt
1-4-1-4插座(1407).mp4
1-4-1-4插座(14_07).srt
1-5-1-5示踪路由(0736).mp4
1-5-1-5示踪路由(07_36).srt
1-6-1-6协议层(2225).mp4
1-6-1-6协议层(22_25).srt
1-7-1-7参考模型(1409).mp4
1-7-1-7参考模型(14_09).srt
1-8-1-8互联网历史(1239).mp4
1-8-1-8互联网历史(12_39).srt
1-9-1-9讲座大纲(0407).mp4
1-9-1-9讲座大纲(04_07).srt
2-1-2-1物理层概述(09_27).mp4
2-1-2-1物理层概述(09_27).srt
2-2-2-2媒体(856).mp4
2-2-2-2媒体(8_56).srt
2-3-2-3信号(1758).mp4
2-3-2-3信号(1758).srt
2-4-2-4调制(1100).mp4
2-4-2-4调制(11_00).srt
2-5-2-5限值(1243).mp4
2-5-2-5限值(12_43).srt
2-6-2-6链路层概述(0414).mp4
2-6-2-6链路层概述(04_14).srt
2-7-2-7框架(1126).mp4
2-7-2-7框架(11_26).srt
2-8-2-8错误概述(1745).mp4
2-8-2-8错误概述(17_45).srt
2-9-2-9错误检测(2317).mp4
2-9-2-9错误检测(23_17).srt
2-10-2-10纠错(1928).mp4
2-10-2-10纠错(19_28).srt
我想重命名mp4文件以匹配srt文件,这样vlc可以在我播放视频时自动加载字幕。有人会讨论什么算法来做这件事?您还可以提供任何语言的解决方案代码,因为我熟悉许多编程语言。但是Python和C++是比较好的。 编辑
感谢所有回复的人。我知道重命名srt文件比用其他方法更容易。但是我认为重命名mp4文件会更有趣。有什么建议吗?

如果所有这些文件都遵循此方案,Python实现几乎是微不足道的:

import glob, os

for subfile in glob.glob("*.srt")
    os.rename(subfile, subfile.replace("_",""))

如果mp4还包含下划线,则需要为其添加额外的循环。

如果所有这些文件都遵循此方案,则Python实现几乎是微不足道的:

import glob, os

for subfile in glob.glob("*.srt")
    os.rename(subfile, subfile.replace("_",""))

如果mp4还包含下划线,则需要为其添加一个附加循环。

用于*.srt中的f;do mv$f${f%};已完成

,用于*.srt中的f;do mv$f${f%};完成

这里有一个python快速解决方案

如果您做出以下假设,那么工作很简单:

  • 所有文件都在同一文件夹中
  • 目录中的srt和mp4文件数量相同
  • 所有srt按字母顺序排列,所有mp4按字母顺序排列
  • 注意:我不假设实际名称的任何内容(例如,您只需要删除下划线)

    因此,您不需要任何特殊的逻辑来匹配文件,只需逐一进行即可

    import os, sys, re
    from glob import glob
    
    def mv(src, dest):
        print 'mv "%s" "%s"' % (src, dest)
        #os.rename(src, dest)  # uncomment this to actually rename the files
    
    dir = sys.argv[1]
    
    vid_files = sorted(glob(os.path.join(dir, '*.mp4')))
    sub_files = sorted(glob(os.path.join(dir, '*.srt')))
    assert len(sub_files) == len(vid_files), "lists of different lengths"
    
    for vidf, subf in zip(vid_files, sub_files):
        new_vidf = re.sub(r'\.srt$', '.mp4', subf)
        if vidf == new_vidf:
            print '%s OK' % ( vidf, )
            continue
        mv(vidf, new_vidf)
    
    同样,这只是一个快速脚本。建议的改进:

  • 支持不同的文件扩展名
  • 使用更好的cli,例如
    argparse
  • 支持使用多个目录
  • 支持测试模式(不实际重命名文件)
  • 更好的错误报告(而不是使用
    assert
  • 更高级:支持撤消

  • 这里有一个python的快速解决方案

    如果您做出以下假设,那么工作很简单:

  • 所有文件都在同一文件夹中
  • 目录中的srt和mp4文件数量相同
  • 所有srt按字母顺序排列,所有mp4按字母顺序排列
  • 注意:我不假设实际名称的任何内容(例如,您只需要删除下划线)

    因此,您不需要任何特殊的逻辑来匹配文件,只需逐一进行即可

    import os, sys, re
    from glob import glob
    
    def mv(src, dest):
        print 'mv "%s" "%s"' % (src, dest)
        #os.rename(src, dest)  # uncomment this to actually rename the files
    
    dir = sys.argv[1]
    
    vid_files = sorted(glob(os.path.join(dir, '*.mp4')))
    sub_files = sorted(glob(os.path.join(dir, '*.srt')))
    assert len(sub_files) == len(vid_files), "lists of different lengths"
    
    for vidf, subf in zip(vid_files, sub_files):
        new_vidf = re.sub(r'\.srt$', '.mp4', subf)
        if vidf == new_vidf:
            print '%s OK' % ( vidf, )
            continue
        mv(vidf, new_vidf)
    
    同样,这只是一个快速脚本。建议的改进:

  • 支持不同的文件扩展名
  • 使用更好的cli,例如
    argparse
  • 支持使用多个目录
  • 支持测试模式(不实际重命名文件)
  • 更好的错误报告(而不是使用
    assert
  • 更高级:支持撤消

  • 这只是Zeta所说的一个实现:)


    这只是Zeta所说的一个实现:)


    呃,只是全部
    .str
    并删除下划线?算法很简单:对于每个mp4文件,找到其对应的srt文件(1),并将其重命名为与mp4文件相同的名称,但具有另一个扩展名。你应该试试看。(1) 这应该不难,因为在文件名的第一个字段中有识别信息。呃,只需全部
    .str
    并删除下划线?算法很简单:对于每个mp4文件,找到其对应的srt文件(1),并将其重命名为与mp4文件相同的名称,但具有另一个扩展名。你应该试试看。(1) 这应该不难,因为您在文件名的第一个字段中有标识信息。虽然有效,但这只适用于类似于
    bash
    的环境。它不能在Windows上使用:(。虽然有效,但它只适用于类似于
    bash
    的环境。它不能在Windows上使用:(.似乎OP希望重命名
    mp4
    s而不是
    srt
    。我编辑了您的答案,因为它最适合此任务。感谢shx2和@Zeta。此脚本完全符合我的要求,并感谢建议的改进。我稍后将尝试进行改进。似乎OP希望这样做