Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
检查python中是否存在记录。如果存在,则跳过else进程_Python_Csv - Fatal编程技术网

检查python中是否存在记录。如果存在,则跳过else进程

检查python中是否存在记录。如果存在,则跳过else进程,python,csv,Python,Csv,我有一个从视频中提取帧的功能。我有一个csv文件,其中包含已处理视频的名称。我想检查csv文件中是否存在新添加的视频文件的名称。如果存在,则退出代码,否则处理函数以从新视频中提取帧 def extractFrames(m): global vid_name vid_files=glob(m) for v_f in range(len(vid_files)): print("path of video========>>>>.",

我有一个从视频中提取帧的功能。我有一个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)

假设文件夹中有两个视频V1和V2,已从中提取帧,并将名称V1和V2添加到csv文件中。现在,当我添加视频V3时,代码应该检查csv中是否已经存在V3。如果存在,则应跳过代码,否则应处理V3中的帧,并在提取帧后将V3添加到csv文件中,而无需使用类似代码的详细信息

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 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)
def load_done_list(): 使用open('video_info.csv')作为f:#或完整路径,是否可以传入文件名? 返回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
我没有填写所有的细节,但已经显示了可以在哪里进行加载、保存和检查。 写入的文件中只有文件名-在每行末尾“完成”似乎没有多大意义。
这将在处理文件时持续打开和关闭文件。这可能会减慢速度,但可能并不重要:您可以传入一个要写入的文件句柄,使其保持打开状态。您可以选择。

我认为您可能需要一个函数来从csv文件中获取已完成/完成的视频列表。 类似这样的内容,可能需要对标题行进行一些调整

def get_completed_videos():
    completed_videos = []
    with open(".../video_info.csv") as csv_file:
        for row in csv.reader(csv_file):
            completed_videos.append(row[0])
    return completed_videos
然后在提取函数中排除它们

def extractFrames(m):
    global vid_name

    vid_files=glob(m)
    complete_videos = get_completed_videos()
    new_vid_files = [x for x in vid_files if x not in complete_videos]

    ...

您的代码当前提供了什么输出,以及您希望它输出什么?我不确定打开这样的csv文件是否会像您希望的那样工作。尝试使用
pandas
模块。当我需要自动处理csv文件时,我会使用它。那么,在处理之前,你想先查找
vid_name
?列出已完成的
视频名称是否有帮助?(你能把你的csv读入列表吗?@JerryM。当前我的代码处理文件夹中的所有视频文件。我希望它只从新添加的视频文件中提取帧,而不是从已处理的旧视频文件中提取帧videos@doctorlove一份视频名称列表将非常有用。我其实也在想办法,但问题是那部分应该写在哪里?如何访问主函数中的vid_名称?你能帮我解决一下写作部分吗?你真是太好了,但这就是我面临的全部问题。如何从主部件内的函数访问csv_文件。你也可以编辑我的代码。这是整个功能,不需要其他细节。csv_文件包含已完成视频扫描的名称。请帮助我解决此问题?我已经做了如上所述,但无法访问我的csv文件内的主要功能,这几乎是一个新的问题。尝试打开文件时出现了什么问题?是否需要编写函数的帮助?我已编写了函数,但无法使用在“main”中创建的csv文件来检查视频文件名。我如何做到这一点请参阅我的更新代码下面根据您的想法。我的方法正确吗?但是我已经在我的函数中创建了csv文件来保存视频文件的名称。我只需要访问它,检查视频文件名是否已经存在于csv中。如何在不创建新函数的情况下访问主函数中的csv文件?函数只是用来组织代码。在主功能中,您可以使用上面提供的相同代码打开所述文件,并使用csv.reader获得一个完整的视频列表。我尝试按照建议添加代码,但我有点困惑并面临错误。请在上面给出的实际代码函数中添加您的建议,好吗?我在extractFrames下面创建了一个单独的函数,并在extractFrames中传递了2行。但是方括号给了我无效语法错误的答案,这应该可以修复无效语法错误@Anh Do Hoang这是你建议的吗?如果是,则此代码仍不会检查csv中是否存在视频名称。它处理文件夹中的所有视频。我的方法正确吗?
def extractFrames(m,done):
    global vid_name

    vid_files=glob(m)

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

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

        if vid_name not in done:
            try:
                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"

    y="C:\\multi_cat_3\\models\\research\\object_detection\\my_imgs\\video_info.csv"

    done=list(y)
    extractFrames(x,done)