Закрытие файлов Python при использовании cv2 - PullRequest
0 голосов
/ 26 августа 2018

Заранее извиняюсь за, вероятно, простое исправление, я студент колледжа, изучающий c ++, и впервые использую python для личного проекта.

Я пишу программу, которая извлекает заголовок из медиафайл внутри каталога или подкаталога, а затем проверяет наличие соответствующих строк.Если они есть, он сравнивает их разрешение и удаляет файл с более низким разрешением.Если они оба имеют одинаковое разрешение, он удаляет файл большего размера.Все это работает, за исключением удаления файлов.Когда я пытаюсь это сделать, выдается сообщение о том, что файлы используются.Проведя некоторые исследования, я узнал, что это потому, что у меня есть файлы, открытые внутри кода, предотвращающие их удаление.Моя проблема в том, что я не знаю, какую переменную мне нужно закрыть, или подходящий способ и место для этого.

import os
import cv2
import PTN
import json

array1 = [os.path.join(r,file) for r,d,f in os.walk("E:\Python Test Environment") for file in f]

for x in range(0, len(array1)):
    print(array1[x])

array2 = array1[:] #The colon tells it to directly copy rather than do a link

for x in range(0, len(array2)):
    array2[x] = (json.dumps(PTN.parse(array2[x])))
    array2[x] = json.loads(array2[x])['title']
    head, array2[x] = os.path.split(array2[x])
    del head

y = len(array2)

for x in range(0, len(array2)):
    if array2[x] == "":
        break

    for i in range(x, y-1): #Set to x+1 so that it does not compare against the current file
        i = x + 1

        if array2[i] == "":
            break

        if array2[x] == array2[i]:
            print 'Match found!'
            print array1[i]
            print 'Matches: '
            print array1[x]

            with open(array1[x]) as f: #tried to include this to prevent error, doesn't seem to stop it
                capture1 = cv2.VideoCapture(array1[x]) #Open the video
                ret, frame = capture1.read() #Read the first frame
                resolution1 = frame.shape #Get resolution
                f.close()

            with open(array1[i]) as f: #tried to include this to prevent error, doesn't seem to stop it
                capture2 = cv2.VideoCapture(array1[i]) #Open the video
                ret, frame = capture2.read() #Read the first frame
                resolution2 = frame.shape #Get resolution
                f.close()

            if resolution1 > resolution2:
                print array1[x]
                print "Is higher resolution than"
                print array1[i]
                print "Would delete: "
                print array1[i]
                os.remove(array1[i])
                array1[i] = ""
                array2[i] = ""

            if resolution2 > resolution1:
                print array1[i]
                print "Is higher resolution than"
                print array1[x]
                print "Would delete: "
                print array1[i]
                os.remove(array1[x])
                array1[x] = ""
                array2[x] = ""

            if resolution1 == resolution2:
                print "equal"
                if os.path.getsize(array1[x]) <= os.path.getsize(array1[i]):
                    print "Would delete: "
                    print array1[i]
                    os.remove(array1[i])
                    array1[i] = ""
                    array2[i] = ""

                if os.path.getsize(array1[i]) < os.path.getsize(array1[x]):
                print "Would delete: "
                print array1[x]
                os.remove(array1[x])
                array1[x] = ""
                array2[x] = ""

1 Ответ

0 голосов
/ 26 августа 2018

Добавьте capture1.release() и capture2.release(), чтобы освободить ресурсы, используемые VideoCapture экземплярами

...