Форматирование файловых путей с использованием переменных в 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"