Python — вставка строк в текстовом формате после последовательности без перезаписи

#python #video #ffmpeg

#python #Видео #ffmpeg

Вопрос:

Я хочу вставить имя файла перед каждым именем файла, полученным через glob.glob, чтобы я мог объединить их через FFMPEG, отсортировав их по INTRO VIDEO OUTRO, файлы должны следовать этому порядку:

ВСТАВЛЕННОЕ ИМЯ ФАЙЛА ВСТАВЛЕННОЕ ИМЯ
ФАЙЛА
ВСТАВЛЕННОЕ ИМЯ ФАЙЛА ВСТАВЛЕННОЕ ИМЯ
ФАЙЛА ВСТАВЛЕННОЕ ИМЯ ФАЙЛА ВСТАВЛЕННОЕ ИМЯ
ФАЙЛА
ВСТАВЛЕННОЕ
ИМЯ ФАЙЛА ФАЙЛ
ВСТАВЛЕННОЕ ИМЯ ФАЙЛА

Это тот код, который я использую:

 import glob
open("Lista.txt", 'w').close()
file = open("Lista.txt", "a")
list =glob.glob("*.mp4")
for item in list:
  file.write("%sn" % item)
file.close()

f = open("Lista.txt", "r")
contents = f.readlines()
f.close()

for x,item in enumerate(list):
    contents.insert(x, "CTAn")
f = open("Lista.txt", "w")
contents = "".join(contents)
f.write(contents)
print f
f.close()
  

Но я получаю значения в неправильном порядке:

ВСТАВЛЕННОЕ ИМЯ ФАЙЛА
ВСТАВЛЕННОЕ ИМЯ
ФАЙЛА ВСТАВЛЕННОЕ ИМЯ ФАЙЛА
ФАЙЛ
ФАЙЛ
ФАЙЛ

Как я мог это решить? РЕДАКТИРОВАТЬ: как указывалось, возможно, проблема вызвана изменением списка, который я сейчас использую.

Комментарии:

1. Подумайте о том, что происходит с индексами существующих элементов, когда вы вставляете перед ними новый элемент. В общем, изменять длину списка во время итерации по нему — плохая идея.

2. Пожалуйста, не используйте list в качестве переменной, как вы делаете. Это затеняет функцию / класс buildin list . Переименуйте его. То же самое для file .

Ответ №1:

Вы пытаетесь изменить contents список. Я думаю, что если для получения конечного результата используется new list, то он будет простым и более читаемым, как показано ниже. И, как утверждает Zen of Python

Простое всегда лучше, чем сложное.

  1. Считайте, что вы получили file_list , как показано ниже, после выполнения glob.glob .

file_list = [«a.mp4», «b.mp4», «c.mp4»]

  1. Теперь вы хотите добавить « INSERTFILE » до и после каждого элемента file_list , чтобы final_list выглядел как

final_list = [‘INSERTFILE’, ‘a.mp4’, ‘INSERTFILE’, ‘INSERTFILE’, ‘b.mp4’, ‘INSERTFILE’, ‘INSERTFILE’, ‘c.mp4’, ‘INSERTFILE’]

  1. Этот final_list вы запишете в файл.

Краткое изложение проблемы заключается в том, как выполнить шаг 2.

Приведенный ниже код получит шаг 2.

Код (со встроенными комментариями:

 #File List from glob.glob
file_list = ["a.mp4","b.mp4","c.mp4"]
#File to be added
i = "INSERTFILE"
final_list = []
for x in file_list:
    #Create temp_list
    temp_list = [i,x,i]
    #Extend (not append) to final_list
    final_list.extend(temp_list)
    #Clean temp_list for next iteration
    temp_list = []
print (final_list)
  

Вывод:

 C:Usersdinesh_pundkarDesktop>python c.py
['INSERTFILE', 'a.mp4', 'INSERTFILE', 'INSERTFILE', 'b.mp4', 'INSERTFILE', 'INSERTFILE', 'c.mp4', 'INSERTFILE']
  

Комментарии:

1. Вы абсолютно правы! спасибо, это правда, что я переборщил со сложностью, простое решение было бы лучшим, просто я новичок в Python, и я не мог придумать простого решения.