首页 > 解决方案 > 检查python中是否存在记录。如果存在则跳过其他过程

问题描述

我有一个从视频中提取帧的功能。我有一个 csv 文件,其中包含已处理的视频名称。我想检查 csv 文件中是否存在新添加的视频文件的名称。如果存在,则退出代码,否则处理该函数以从新视频中提取帧

def extractFrames(m):
    global vid_name

    vid_files=glob(m)

    for v_f in range(len(vid_files)):
        print("path of video========>>>>.",vid_files[v_f])

        #latest_file=max(vid_files, key=os.path.getctime)

        #print(latest_file)

        v1=os.path.basename(vid_files[v_f])     
        try:
            vid_name = os.path.splitext(v1)[0]

            vidcap = cv2.VideoCapture(vid_files[v_f])
        except cv2.error as e:
            print(e)
        except:
                print('error')
        #condition 
        fsize=os.stat(vid_files[v_f])
        print('=============size of video ===================:' , fsize.st_size)
        try:

            if (fsize.st_size > 1000):

                fps = vidcap.get(cv2.CAP_PROP_FPS)      # OpenCV2 version 2 used "CV_CAP_PROP_FPS"
                frameCount = int(vidcap.get(cv2.CAP_PROP_FRAME_COUNT))
                duration = frameCount/fps
                minutes = int(duration/60)
                print('fps = ' + str(fps))
                print('number of frames = ' + str(frameCount))
                print('duration (S) = ' + str(duration))
                if (duration > 1):
                    success,image = vidcap.read()


                    count=0

                    success=True

                    while success:

                        img_name = vid_name + '_f' + str(count) + ".jpg"

                        success,image = vidcap.read()
                        if count % 10 == 0 or count ==0:
                            target_non_target(img_name, image)

                        count+=1          

                    vidcap.release()

                    cv2.destroyAllWindows()
        except:
            print("error")


        print('finished processing video ', vid_files[v_f])
        with open("C:\\multi_cat_3\\models\\research\\object_detection\\my_imgs"+'/video_info.csv', 'a') as csv_file:
            fieldnames = ['Video_Name','Process']
            file_is_empty = os.stat("C:\\multi_cat_3\\models\\research\\object_detection\\my_imgs"+'/video_info.csv').st_size == 0
            writer = csv.DictWriter(csv_file, fieldnames=fieldnames)
            if file_is_empty:
                writer.writeheader()
            writer.writerow({'Video_Name':vid_name,'Process':'done'})

if __name__ == "__main__":

    x="C:\\Python36\\videos\\*.mp4"

    extractFrames(x)

假设一个文件夹有 2 个视频 V1 和 V2,已经从中提取了帧,并且在 csv 文件中添加了名称 V1 和 V2。现在,当我添加视频 V3 时,代码应该检查 V3 是否已存在于 csv 中。如果存在,则应跳过代码,否则应处理来自 V3 的帧,并在提取帧后将 V3 添加到 csv 文件中

标签: pythoncsv

解决方案


没有细节你有这样的代码

def extractFrames(m):
    # do stuff
    vid_files=glob(m)

    for v_f in range(len(vid_files)):
        #find vid_name
        #do stuff
        save_as_done(vid_name)

if __name == '__main__':
    x="C:\\Python36\\videos\\*.mp4"
    extractFrames(x)

如果你传入一个已经完成的事情的列表,比如

done = ['first.mp4', 'second.mp4']

您可以像这样检查文件名是否已完成:

>>> 'first.mp4' in done
True

因此,如果您将所做操作的文件名(完全路径)保存到文件中并将它们加载到列表中,就像这样

def load_done_list(): with open('video_info.csv') as f: #or full path, 也许传入文件名?返回 f.readlines()

你可以查看列表

def extractFrames(m, done):
    # do stuff
    vid_files=glob(m)

    for v_f in range(len(vid_files)):
        #find vid_name
        if vid_name not in done:  #,--- check if done already
            #do stuff
            save_as_done(vid_name)

if __name == '__main__':
    x="C:\\Python36\\videos\\*.mp4"
    done = load_done_list() #<--- You need to load this into a list
    extractFrames(x, done)  #<--- and pass it in to your function

这需要在完成后保存文件名的东西:

def save_as_done(vid_name):
    with open('video_info.csv', 'a') as f: #maybe pass in the file name so you only define it once?
        f.write(vid_name + '\n')

我没有填写所有详细信息,但已经显示了您可以在哪里进行加载、保存和检查。写入的文件仅包含文件名 - 在每行末尾添加“完成”似乎没有多大意义。这将在处理文件时继续打开和关闭文件。这可能会减慢速度,但可能无关紧要:您可以传入要写入的文件句柄,以使其保持打开状态。你有选择。


推荐阅读