目前我正在用Python分析字幕,所以我下载了一堆字幕,但大多数系列都有多个SRT文件供同一集使用。我想删除重复项,因此我编写了一个正则表达式,生成一个list (re_results),我用','.join(map(str,re_finds))格式化它,因此我得到一个字符串作为列表元素,它只包含每个文件的系列名称、季节和插集。这将使我能够扫描类似的字符串,这是一个副标题重复。
>>> re_duplicate = re.compile(r'^(.+)\s*-{1}\s*(\d+)x{1}(\d+)\s*-.*$')
>>> test_string = "CSI - 11x01 - Shock Waves.HDTV.FQM.en.srt"
>>> re_duplicate.findall(test_string)[0]
('CSI ', '11', '01')
>>> ','.join(map(str, re_duplicate.findall(test_string)[0]))
'CSI ,11,01'(只要字符串标识名称、季号和集号,字符串的外观就无关紧要。)因为我只对这个系列的实际演讲感兴趣,所以我只想保留最小的文件。原因是一个较小的文件很可能不包括我获得副标题的链接,创建者,帮助聋人(“听到接近的脚步声”,不是言语)等等。
实际问题:来比较我创建的以下元组列表:“subtitle_tuple_list”
模式:(“regex输出为字符串”,“文件名的路径”,文件大小),.
[('CSI ,1,01', 'path_to_file\CSI - 11x01 - Shock Waves.HDTV.FQM.en.srt', 53340),
('CSI ,1,01', 'path_to_file\CSI - 11x01 - Shock Waves.HDTV.LOL.en.srt', 52059),
('CSI ,1,02', 'path_to_file\CSI - 11x02 - Pool Shark.HDTV.en.srt', 62697),
('CSI ,1,02', 'path_to_file\CSI - 11x02 - Pool Shark.HDTV.LOL.en.srt', 61159), …]我现在想做的事情(但不能):遍历列表并比较regex输出,对于每个相同的字符串比较文件大小,使用路径和文件名删除所有最小的字符串。
我知道一种方法是使用以下方法获得第一个元组的regex输出:
[item[0] for item in subtitle_tuple_list]然后我必须在下一个元组中查找regex输出,如果它们匹配比较文件大小,则从元组列表中删除较大文件的条目。如果两者是相同的大小,保持第一个。将即将删除的文件保存在单独的列表中。这样做,直到您得到一个新的regex输出,这是另一集。重复直到每集只剩下一个文件,这意味着新的列表现在包含所有要删除的文件。删除该列表中提到的所有文件。
我不知道怎么写这部分。
另外一个问题是:是否有更好的方法删除不需要的字幕文件?
发布于 2017-08-25 14:10:20
您可以使用defaultdict通过列表中的regex收集所有文件。然后按文件大小对列表进行排序:
from collections import defaultdict
data = [('CSI ,1,01', 'path_to_file\CSI - 11x01 - Shock Waves.HDTV.FQM.en.srt', 53340),
('CSI ,1,01', 'path_to_file\CSI - 11x01 - Shock Waves.HDTV.LOL.en.srt', 52059),
('CSI ,1,02', 'path_to_file\CSI - 11x02 - Pool Shark.HDTV.en.srt', 62697),
('CSI ,1,02', 'path_to_file\CSI - 11x02 - Pool Shark.HDTV.LOL.en.srt', 61159)]
dic = defaultdict(list)
for (reg, file, size) in data:
dic[reg].append((file, size))
for key in dic:
item=dic[key]
item.sort(key=lambda t:t[1])
print(item[0])产出:
('path_to_file\\CSI - 11x01 - Shock Waves.HDTV.LOL.en.srt', 52059)
('path_to_file\\CSI - 11x02 - Pool Shark.HDTV.LOL.en.srt', 61159)发布于 2017-08-25 14:08:32
若要按需要筛选列表,可以使用熊猫:
>>> data = [('CSI ,1,01', 'path_to_file\CSI - 11x01 - Shock Waves.HDTV.FQM.en.srt', 53340), ('CSI ,1,01', 'path_to_file\CSI - 11x01 - Shock Waves.HDTV.LOL.en.srt', 52059), ('CSI ,1,02', 'path_to_file\CSI - 11x02 - Pool Shark.HDTV.en.srt', 62697), ('CSI ,1,02', 'path_to_file\CSI - 11x02 - Pool Shark.HDTV.LOL.en.srt', 61159)]
>>> import pandas as pd
>>> df = pd.DataFrame(data)
>>> df = df.groupby(0).min()
>>> df
1 2
0
CSI ,1,01 path_to_file\CSI - 11x01 - Shock Waves.HDTV.FQ... 52059
CSI ,1,02 path_to_file\CSI - 11x02 - Pool Shark.HDTV.LOL... 61159若要将其转换回列表,请执行以下操作:
df.values.tolist()发布于 2017-08-25 14:04:26
所以让我把这个做对。很多CSI都有很多SRT。你想把它安排成每个CSI集都有一个1 SRT。
所有的文件都在同一个目录中吗?更好的是,可以将示例文件放在git上查看吗?因为解决方案有很大的可变性,这取决于它们的排列方式和内容。
https://stackoverflow.com/questions/45882872
复制相似问题