python - 检查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 文件中
解决方案
没有细节你有这样的代码
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')
我没有填写所有详细信息,但已经显示了您可以在哪里进行加载、保存和检查。写入的文件仅包含文件名 - 在每行末尾添加“完成”似乎没有多大意义。这将在处理文件时继续打开和关闭文件。这可能会减慢速度,但可能无关紧要:您可以传入要写入的文件句柄,以使其保持打开状态。你有选择。
推荐阅读
- php - 从外部文件呈现 PHP 代码的另一种方法
- c# - c# || 我需要一个变量来控制另一个变量,但都计算自己的范围。我怎么能这样做?
- server - 工作几天后服务器上的Redis坏了
- python - 将 Silenium 与 Chrome 的 webdriver 一起使用并获得“权限被拒绝”或“没有这样的文件或目录”(Mac)
- python - 我得到 x 和 y 标签和增量数据,但没有图表线。使用 Jupyter 笔记本
- swift - SwiftUI contextMenu 显示以前的值
- javascript - Electron:添加 redux 开发工具
- javascript - 未捕获的类型错误:无法读取未定义 Javascript 的属性“长度”
- webpack - 启动本地开发服务器:这会打开计算机到互联网吗?
- python - 如何删除 ipython 交互窗口中的错误单元格?