所以我有一个如下列表:
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
关于我如何处理此事的任何想法?
答案 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
文件,您打算做什么? ;)