Форматирование файловых путей с использованием переменных в os.path

Я написал скрипт, который разбивает видеофайл на фреймы, используя cv2 и некоторые другие модули. До сих пор я был счастлив вставлять в пути к файлам и запускать код, но теперь я хочу, чтобы пользователь вводил пути к файлам и имена в ответ на приглашение. Это должно быть легко, но у меня много проблем с тем, чтобы os.path работал на меня. Основная проблема заключается в том, что я хочу, чтобы имя каждого файла изображения (т. Е. Фрейма) имело номер в нем, который показывает, где он находится в последовательности. Код ниже, это то, что у меня есть:

filepath = input('Please enter the filepath for the clip: ') 

clip = cv2.VideoCapture(filepath)

#### This code splits the clip into scenes

filepath1 = input('Please enter the filepath for where the frames should be saved: ') 

name = input('Please enter the name of the clip: ') 

ret, frame = clip.read()
count = 0
ret == True
while ret:
    ret, frame = clip.read()
    cv2.imwrite((os.path.join(filepath1,name, '(%d)','.png') % count, frame))
    count += 1

Однако выдает следующую ошибку:

cv2.imwrite((os.path.join(filepath1,name, '(%d)','.png') % count, frame))
    TypeError: Required argument 'img' (pos 2) not found

В том числе % count, frame Переменные в скобках в команде os.path.join выдают другую ошибку:

TypeError: not all arguments converted during string formatting

Что он должен сделать, это написать несколько файлов.png под названием name(x) в таком месте, как MYcomputer/mydesktop/myfolder/, Я не уверен, что здесь пошло не так - любая помощь приветствуется!

1 ответ

Решение

Ваше размещение в скобках, а также использование join это неправильно

cv2.imwrite((os.path.join(filepath1,name, '(%d)','.png') % count, frame))

должно быть исправлено к этому:

cv2.imwrite(os.path.join(filepath1, name+'(%d).png'%count), frame)

Для дальнейшего улучшения кода я бы предложил

fname = "{name}({count}).png".format(name=name, count=count)
cv2.imwrite(os.path.join(filepath1, fname), frame)

Вот краткое объяснение os.path.join: Он объединяет все аргументы с разделителем пути вашей ОС ("/" в Unix-системах и "\" в Windows). В результате ваш оригинальный код приведет к следующей строке:

filepath1 = "some_dir"
name = "some_name"
count = 10
print(os.path.join(filepath1, name, '(%d)' % count,'.png'))
>>> "some_dir/some_name/10/.png"
Другие вопросы по тегам