2014-10-28 113 views
0

所以我有一个列表如下:Python。遍历文件列表,找到相同的文件名,但扩展名不同

mylist = ['movie1.mp4','movie2.srt','movie1.srt','movie3.mp4','movie1.mp4']

注:一个简单的列表进行测试,该脚本将处理未知文件名和更多其中。

所以我想找到配对的srt文件的电影文件,并将它们放在一个字典中。剩下的东西(即movie3.mp4)将留在列表中并在稍后处理。

我一直在玩列表理解,虽然它可能不会留下剩余的数据,并允许我构造字典。

import re matches = [ x for x, a in mylist if (re.sub('\.srt$', '\.mp4$', a) == x or re.sub('\.srt$', '\.mp4$', a) == x) ]

这将返回: ValueError: too many values to unpack

如何,我可能接近这个任何想法?

回答

2

您对问题采用了错误的方法。最简单的方法是使用os.path.splitext来确定文件的基本名称,并根据它们进行分组。一种可能的方法是使用itertools.groupby

实施

groups = {key: set(value) 
     for key, value in groupby(sorted(mylist, 
             key = lambda e: os.path.splitext(e)[0]), 
           key = lambda e: os.path.splitext(e)[0])} 

>>> pprint.pprint(groups) 
{'movie1': set(['movie1.mp4', 'movie1.srt']), 
'movie2': set(['movie2.srt']), 
'movie3': set(['movie3.mp4'])} 
+0

这很好用。我之前没有使用os.path.splitext;很有用。谢谢! – ryan461 2014-10-29 11:10:04

0

我会分裂的任务分成分离的担忧:首先构建字典,与分组文件同名根;稍后检查哪些有视频和字幕文件。 (并且请不要使用正则表达式来分割文件名,os.path在这里做的更好)。

from collections import defaultdict 
import os 

mylist = ['movie1.mp4','movie2.srt','movie1.srt','movie3.mp4','movie1.mp4'] 

movies = defaultdict(dict) 
for filename in mylist: 
    name, ext = os.path.splitext(filename) 
    movies[name][ext] = filename 

sub_extentions = set(['.txt', '.srt']) 
movie_extensions = set(['.mp4', '.avi']) 


for name, files in movies.items(): 
    files_set = set(files.keys()) 
    if not files_set & sub_extentions: 
     continue # no subs 
    elif not files_set & movie_extensions: 
     continue # no movie 
    else: 
     print name, files.values() 
# output: movie1 ['movie1.srt', 'movie1.mp4'] 

PS。你打算怎么处理.mkv附带字幕的文件? ;)

相关问题