2013-04-06 70 views
0

所以我已经从Coursera下载了“Introduction to computer networks”课程的mp4和srt文件。但mp4和srt文件的名称之间略有差异。如何编写一个程序来重命名mp4文件以匹配srt文件的名称?

文件名样本如下:

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文件比其他方式更容易。但我认为重命名mp4文件会更有趣。有什么建议么?

+1

错误,只是['glob'](http://docs.python.or g/2/library/glob.html)所有'.str'并删除下划线?这就像十条蟒蛇线一样。 – Zeta 2013-04-06 07:41:07

+0

该算法很简单:对于每个mp4文件,找到其相应的srt文件(1),并将其重命名为mp4文件具有的同名文件,但使用另一个扩展名。你应该继续尝试。 (1)不应该很难,因为您在文件名的第一个字段中具有识别信息。 – Mariano 2013-04-06 07:47:34

回答

2

这里是Python中的快速解决方案。

的工作很简单,如果你做如下假设:

  1. 所有文件都在同一文件夹
  2. 您在目录中有
  3. 所有SRT是相同数量的SRT和MP4文件按字母顺序排列,所有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) 

再次,这只是一个快速的脚本。改进建议:

  1. 支持不同的文件扩展
  2. 使用更好的CLI,例如​​
  3. 支持以多个目录
  4. 支持测试模式(实际上不重命名文件)
  5. 更好的错误报告(而不是使用assert
  6. 更先进:支持撤销
+0

似乎OP想让'mp4's改名而不是'srt'。我编辑了你的答案,因为它是最适合这个任务的。 – Zeta 2013-04-06 09:06:35

+0

谢谢shx2和@Zeta。这个脚本完全符合我的要求,并且非常感谢你提出的改进建议。我会尽力在稍后做出改进。 – ikhthiandor 2013-04-06 15:26:33

3

如果所有这些文件确实按照这个方案的Python实现几乎是微不足道的:

import glob, os 

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

如果你的MP4中还含有强调要添加一个额外的循环他们。

2

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

+0

虽然有效,但只适用于类似bash的环境。它不能在Windows上使用:(。 – Zeta 2013-04-06 08:54:59

1

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

import os; 
from path import path; 
for filename in os.listdir('.'):   
    extension = os.path.splitext(path(filename).abspath())[1][1:] 
    if extension == 'srt':   
     newName = filename.replace('_',''); 
     print 'Changing\t' + filename + ' to\t' + newName; 
     os.rename(filename,newName); 
print 'Done!' 
相关问题