【问题标题】:How to delete file after I finished using it?使用完后如何删除文件?
【发布时间】:2019-02-09 11:01:19
【问题描述】:

我在使用完文件后尝试删除文件,但我一直收到错误...

错误:

PermissionError: [WinError 32] 进程无法访问该文件,因为它正被另一个进程使用:'0.mp4'

我尝试关闭对象但它不起作用...

import os
from moviepy.editor import VideoFileClip, concatenate_videoclips

DEFAULT_HEIGHT = 720
DEFAULT_WIDTH = 1280

clip_names = ["0.mp4", "1.mp4"]

clips = []
for name in clip_names:
    clips.append(VideoFileClip(name).resize(width=DEFAULT_WIDTH,height=DEFAULT_HEIGHT))

final_clip = concatenate_videoclips(clips)
final_clip.write_videofile("video.mp4")

for clip in clips:
    clip.__del__()

for name in clip_names:
    os.remove(name)

我想用 os.remove 删除文件...

【问题讨论】:

  • 错误是什么?
  • 你的 os.remove(name) 应该在 for 语句中。
  • 也修复缩进
  • 错误:PermissionError: [WinError 32] 进程无法访问该文件,因为它正被另一个进程使用:'0.mp4'
  • [WinError 32] 表示您使用的是 Windows。哪个版本?您是否在打开的文件句柄上查看了性能监视器?哪些进程会锁定您的文件?

标签: python windows moviepy


【解决方案1】:

您是否尝试简单地关闭剪辑?

for clip in clips:
    clip.close()

来源here

或者,如果您想在出现错误时干净利落地执行此操作,请使用 with 上下文:

import contextlib

with contextlib.ExitStack() as stack:
    clips = []
    for name in clip_names:
        clip = VideoFileClip(name)
        stack.enter_context(contextlib.closing(clip))
        clips.append(clip.resize(width=DEFAULT_WIDTH,height=DEFAULT_HEIGHT))

    final_clip = concatenate_videoclips(clips)
    final_clip.write_videofile("video.mp4")

# exiting the `with` block released the clips
for name in clip_names:
    os.remove(name)

这种方法使用ExitStack 来跟踪剪辑。当程序退出with 块时,所有传递给enter_context 的上下文都将退出,释放所有剪辑。

【讨论】:

  • .close(),不再是一个选项。 (AttributeError: 'VideoFileClip' 对象没有属性 'close')
  • 嗯,你用的是旧版本吗? close 是在最新版本中添加的,来自文件历史记录。
  • github 上有一个关于添加.close() 的问题:github.com/Zulko/moviepy/issues/596 — TLDR 你必须升级到最新版本才能获得.close() 方法,否则你将无法完全关闭剪辑。
  • 我正在使用'0.2.3.2',我认为它是最后一个版本...我检查了文档,但没有找到 close() 函数。
  • 是的,我错了。我有另一个库的要求,这并没有让我下载最新版本。谢谢...
猜你喜欢
  • 1970-01-01
  • 2014-12-24
  • 2017-03-24
  • 2011-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-26
  • 2011-04-20
相关资源
最近更新 更多