#python-3.x
#python-3.x
Вопрос:
Следующий код извлекает данные субтитров из файлов mkv. Я хочу, чтобы выходные данные были в одном списке, но он создает список для каждого трека. Как можно изменить код, чтобы получить один список, содержащий все треки, а не список для каждого трека?
#!/usr/bin/env python3 import os import re import json import subprocess from itertools import chain mkvmerge = "/usr/bin/mkvmerge" keep_lang = "eng" ############################################################################# def extract_subs(mkv_list): subtitle_tracks = [] video_tracks = [] audio_tracks = [] extractList = [] for file in mkv_list: ### Commandline auguments for extracting info about the mkv file command = [mkvmerge, "-i", "-F", "json", file] # Ask mkvmerge for the json info process = subprocess.run(command, capture_output=True, text=True, check=True) stdout = process.stdout ### Process the json response json__data = json.loads(stdout) tracks = json__data.get('tracks', []) ### find audio and subtitle tracks audio = [] subtitle = [] track_list = [] for track in tracks: track['properties']['id'] = track['id'] if track['type'] == 'audio': audio.append(track) elif track['type'] == 'subtitles': subtitle.append(track) # filter out files that don't need processing if len(audio) lt; 2 and len(subtitle) lt; 2: pass #print("nNo extracted subs to process.", file) subtitle_keep = list(filter(lambda a: a ['properties']['language']==keep_lang, subtitle)) for s in subtitle_keep: track_list.append(f"Track #{s['id']}: " f"{s['properties'].get('language')}" f" - " f"{s['codec']}: " file) print (track_list)
выход
['Track #2: eng - SubRip/SRT: /home/mp/torrents/test/Belfast (2021)/Belfast (2021).mkv', 'Track #3: eng - SubRip/SRT: /home/mp/torrents/test/Belfast (2021)/Belfast (2021).mkv'] ['Track #2: eng - SubRip/SRT: /home/mp/torrents/test/The Rescue (2021)/The Rescue (2021).mkv']
желаемый результат
['Track #2: eng - SubRip/SRT: /home/mp/torrents/test/Belfast (2021)/Belfast (2021).mkv', 'Track #3: eng - SubRip/SRT: /home/mp/torrents/test/Belfast (2021)/Belfast (2021).mkv', 'Track #2: eng - SubRip/SRT: /home/mp/torrents/test/The Rescue (2021)/The Rescue (2021).mkv']
Комментарии:
1. Не могли бы вы, пожалуйста, предоставить образец выходных данных?
2. Пожалуйста, предоставьте образец вывода и желаемый результат.
Ответ №1:
Похоже, что ваша переменная track_list
имеет неправильную область действия. Попробуйте вывести его за рамки for loop
.
#!/usr/bin/env python3 import os import re import json import subprocess from itertools import chain mkvmerge = "/usr/bin/mkvmerge" keep_lang = "eng" ############################################################################# def extract_subs(mkv_list): subtitle_tracks = [] video_tracks = [] audio_tracks = [] extractList = [] track_list = [] for file in mkv_list: ### Commandline auguments for extracting info about the mkv file command = [mkvmerge, "-i", "-F", "json", file] # Ask mkvmerge for the json info process = subprocess.run(command, capture_output=True, text=True, check=True) stdout = process.stdout ### Process the json response json__data = json.loads(stdout) tracks = json__data.get('tracks', []) ### find audio and subtitle tracks audio = [] subtitle = [] for track in tracks: track['properties']['id'] = track['id'] if track['type'] == 'audio': audio.append(track) elif track['type'] == 'subtitles': subtitle.append(track) # filter out files that don't need processing if len(audio) lt; 2 and len(subtitle) lt; 2: pass #print("nNo extracted subs to process.", file) subtitle_keep = list(filter(lambda a: a ['properties']['language']==keep_lang, subtitle)) for s in subtitle_keep: track_list.append(f"Track #{s['id']}: " f"{s['properties'].get('language')}" f" - " f"{s['codec']}: " file) print (track_list)