首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何编写一个程序来重命名mp4文件以匹配srt文件的名称?

如何编写一个程序来重命名mp4文件以匹配srt文件的名称?
EN

Stack Overflow用户
提问于 2013-04-06 07:38:46
回答 4查看 1.2K关注 0票数 0

因此,我已经下载了mp4和srt文件,用于“计算机网络入门”课程。但是,mp4和srt文件的名称之间存在着细微的差异。

文件名示例如下:

代码语言:javascript
复制
1 - 1 - 1-1 Goals and Motivation (1253).mp4
1 - 1 - 1-1 Goals and Motivation (12_53).srt
1 - 2 - 1-2 Uses of Networks (1316).mp4
1 - 2 - 1-2 Uses of Networks (13_16).srt
1 - 3 - 1-3 Network Components (1330).mp4
1 - 3 - 1-3 Network Components (13_30).srt
1 - 4 - 1-4 Sockets (1407).mp4
1 - 4 - 1-4 Sockets (14_07).srt
1 - 5 - 1-5 Traceroute (0736).mp4
1 - 5 - 1-5 Traceroute (07_36).srt
1 - 6 - 1-6 Protocol Layers (2225).mp4
1 - 6 - 1-6 Protocol Layers (22_25).srt
1 - 7 - 1-7 Reference Models (1409).mp4
1 - 7 - 1-7 Reference Models (14_09).srt
1 - 8 - 1-8 Internet History (1239).mp4
1 - 8 - 1-8 Internet History (12_39).srt
1 - 9 - 1-9 Lecture Outline (0407).mp4
1 - 9 - 1-9 Lecture Outline (04_07).srt
2 - 1 - 2-1 Physical Layer Overview (09_27).mp4
2 - 1 - 2-1 Physical Layer Overview (09_27).srt
2 - 2 - 2-2 Media (856).mp4
2 - 2 - 2-2 Media (8_56).srt
2 - 3 - 2-3 Signals (1758).mp4
2 - 3 - 2-3 Signals (17_58).srt
2 - 4 - 2-4 Modulation (1100).mp4
2 - 4 - 2-4 Modulation (11_00).srt
2 - 5 - 2-5 Limits (1243).mp4
2 - 5 - 2-5 Limits (12_43).srt
2 - 6 - 2-6 Link Layer Overview (0414).mp4
2 - 6 - 2-6 Link Layer Overview (04_14).srt
2 - 7 - 2-7 Framing (1126).mp4
2 - 7 - 2-7 Framing (11_26).srt
2 - 8 - 2-8 Error Overview (1745).mp4
2 - 8 - 2-8 Error Overview (17_45).srt
2 - 9 - 2-9 Error Detection (2317).mp4
2 - 9 - 2-9 Error Detection (23_17).srt
2 - 10 - 2-10 Error Correction (1928).mp4
2 - 10 - 2-10 Error Correction (19_28).srt

我希望重命名mp4文件以匹配srt文件,这样vlc可以在播放视频时自动加载字幕。有什么人讨论的是算法来做到这一点?您还可以提供任何语言的解决方案代码,因为我熟悉许多编程语言。但是python和c++更好。

编辑:感谢每一个回复的人。我知道重命名srt文件比重命名srt文件更容易。但是我认为重命名mp4文件会更有趣。有什么建议吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-04-06 07:56:22

这里是python的一个快速解决方案。

如果您做了以下假设,那么这项工作就很简单:

  1. 所有文件都在同一个文件夹中。
  2. 目录中有相同数量的srt和mp4文件。
  3. 所有srt按字母顺序排列,所有mp4按字母顺序排列。

注意,我没有假设任何关于实际名称的内容(例如,您只需要删除下划线)。

所以你不需要任何特殊的逻辑来匹配文件,只需要一个一个地去。

代码语言:javascript
复制
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)

再说一遍,这只是一个简单的脚本。建议的改进:

  1. 支持不同的文件扩展名
  2. 使用更好的cli,例如argparse
  3. 支持获取多个目录
  4. 支持测试模式(实际上不要重命名文件)
  5. 更好的错误报告(而不是使用assert)
  6. 更高级:支持撤销
票数 2
EN

Stack Overflow用户

发布于 2013-04-06 07:55:13

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

代码语言:javascript
复制
import glob, os

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

如果您的mp4还包含下划线,您希望为它们添加一个额外的循环。

票数 2
EN

Stack Overflow用户

发布于 2013-04-06 07:56:11

for f in *.srt; do mv $f ${f%_}; done

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15848317

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档