Прекратите создавать Новый список на каждой итерации

#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)