蟒蛇。迭代文件列表,查找相同的文件名但不同的扩展名

时间:2014-10-28 21:20:01

标签: python list list-comprehension

所以我有一个如下列表:

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 个答案:

答案 0 :(得分: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'])}

答案 1 :(得分: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文件,您打算做什么? ;)