【问题标题】:Python. Iterate over a list of files, finding same filenames but different extensionsPython。遍历文件列表,找到相同的文件名但不同的扩展名
【发布时间】:2014-10-28 21:20:01
【问题描述】:

所以我有一个列表如下:

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

有什么想法可以解决这个问题吗?

【问题讨论】:

    标签: python list list-comprehension


    【解决方案1】:

    您对问题采用了错误的方法。最简单的方法是使用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'])}
    

    【讨论】:

    • 效果很好。我以前没有使用过 os.path.splitext;很有用。谢谢!
    【解决方案2】:

    我会将任务划分为不同的关注点:首先构建字典,将具有相同根名的文件分组;稍后检查哪些有视频和字幕文件。 (请不要使用正则表达式来拆分文件名,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 带字幕的文件? ;)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-24
      • 1970-01-01
      • 2016-09-12
      • 2011-05-16
      • 2021-11-15
      相关资源
      最近更新 更多