Seite 1 von 1

Datei löschen nicht möglich

Verfasst: Mittwoch 25. August 2021, 20:12
von Domroon
Hallo Leute,

ich habe ein kleines Programm geschrieben, welches das erste Frame eines Videos "herauszieht" und als JPEG-Bild abspeichert.
Ich möchte gerne nach dem Speichervorgang das Video in den übergeordneten Ordner verschieben.

Nachdem das Programm das Video in den übergeordneten Ordner kopiert hat, versucht es das Video zu löschen. Da es ja nun im übergeordneten Ordner existiert.
Das Video kann nicht gelöscht werden, stattdessen bekomme ich diesen Fehler:

Code: Alles auswählen

Traceback (most recent call last):
  File "C:\Program Files\Python39\lib\shutil.py", line 806, in move
    os.rename(src, real_dst)
PermissionError: [WinError 32] Der Prozess kann nicht auf die Datei zugreifen, da sie von einem anderen Prozess verwendet wird: 'C:\\Users\\haeus\\workspace\\barn-guard-website\\backend\\video-data\\new\\123.mp4' -> 'C:\\Users\\haeus\\workspace\\barn-guard-website\\backend\\video-data\\123.mp4'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\Users\haeus\workspace\barn-guard-website\backend\thumbnail_test.py", line 54, in <module>
    main()
  File "C:\Users\haeus\workspace\barn-guard-website\backend\thumbnail_test.py", line 50, in main
    shutil.move(video_path, destination_folder)
  File "C:\Program Files\Python39\lib\shutil.py", line 821, in move
    os.unlink(src)
PermissionError: [WinError 32] Der Prozess kann nicht auf die Datei zugreifen, da sie von einem anderen Prozess verwendet wird: 'C:\\Users\\haeus\\workspace\\barn-guard-website\\backend\\video-data\\new\\123.mp4'
Der Fehler sagt ja, dass die Datei gerade verwendet wird und deswegen nicht gelöscht werden kann. Ich befürchte fast, dass das Python-Programm selbst die Datei benutzt :lol:
Wenn dem so sein sollte verstehe ich nicht warum. Falls es nicht mein Programm ist, gibt es eine Möglichkeit herauszufinden von welchem Programm die Datei momentan benutzt wird?

Danke euch schonmal :wink:

Hier mein vollständiges Programm:

Code: Alles auswählen

from moviepy.editor import VideoFileClip
from PIL import Image
import os
import shutil


BASE_PATH = os.getcwd() #+ '\\backend'


def generate_path(target):
    if target == "video":
        return BASE_PATH + '\\video-data\\new\\'
    elif target == "thumbnail":
        return BASE_PATH + '\\thumbnail_pics\\'
    elif target == "video-move":
        return BASE_PATH + '\\video-data\\'


def generate_thumbnail(video_path, thumbnail_path):
    video = VideoFileClip(video_path)
    frame = video.get_frame(0)
    thumbnail_jpg = Image.fromarray(frame)
    thumbnail_jpg.save(thumbnail_path)


def generate_thumbnail_name(videoname):
    split_video = videoname.split('.')
    return split_video[0] + '.jpg'

    
def main():
    # videonames are a random hash number
    videoname = "123.mp4" 
    # thumbnail names are the same name as the video (only data-format ending is another)
    thumbnail_name = generate_thumbnail_name(videoname) 

    video_path = f'{generate_path("video")}{videoname}'
    thumbnail_path = f'{generate_path("thumbnail")}{thumbnail_name}'
    print()
    print(f'Get Thumbnail Picture from: {video_path}')
    print()
    print(f'Save Thumbnail Picture at: {thumbnail_path}')
    print()

    generate_thumbnail(video_path, thumbnail_path)

    # move the videofile out of new-Folder
    destination_folder = generate_path("video-move")
    print(destination_folder)
    shutil.move(video_path, destination_folder)


if __name__ == '__main__':
    main()


Re: Datei löschen nicht möglich

Verfasst: Mittwoch 25. August 2021, 20:27
von sparrow
Pfade sind keine Zeichenketten und sie werden nicht mit + oder Stringformatierung zusammen gestückelt. Verwende das Modul pathlib.

Ist die Ziel oder die Quelldatei geöffnet?

Re: Datei löschen nicht möglich

Verfasst: Mittwoch 25. August 2021, 20:32
von Domroon
sparrow hat geschrieben: Mittwoch 25. August 2021, 20:27 Pfade sind keine Zeichenketten und sie werden nicht mit + oder Stringformatierung zusammen gestückelt. Verwende das Modul pathlib.
Okay mache ich :wink:
sparrow hat geschrieben: Mittwoch 25. August 2021, 20:27 Ist die Ziel oder die Quelldatei geöffnet?
Ich habe alle Programme geschlossen die, die Datei hätten benutzen können. Wenn Sie benutzt wird, dann wüsste ich nicht welches Programm es tut :o

Re: Datei löschen nicht möglich

Verfasst: Mittwoch 25. August 2021, 20:36
von sparrow
Aber du siehst in der Fehlermeldung den Pfad der Datei, die gesperrt ist. Ist das dier Quell- oder die Zieldatei?

Re: Datei löschen nicht möglich

Verfasst: Mittwoch 25. August 2021, 20:40
von Sirius3
Du mußt die Video-Datei schon auch wieder schließen.

Code: Alles auswählen

import shutil
from pathlib import Path
from moviepy.editor import VideoFileClip
from PIL import Image

BASE_PATH = Path('.') #+ '\\backend'
TARGETS = {
    "video": BASE_PATH / "video-data" / "new",
    "thumbnail": BASE_PATH / "thumbnail_pics",
    "video-move": BASE_PATH / "video-data",
}

def generate_thumbnail(video_path, thumbnail_path):
    with VideoFileClip(video_path) as video:
        frame = video.get_frame(0)
    thumbnail_jpg = Image.fromarray(frame)
    thumbnail_jpg.save(thumbnail_path)

def main():
    # videonames are a random hash number
    video_path = TARGETS["video"] / "123.mp4" 
    thumbnail_path = (TARGETS["thumbnail"] / video_path.name).with_suffix('.jpg')
    print()
    print(f'Get Thumbnail Picture from: {video_path}')
    print()
    print(f'Save Thumbnail Picture at: {thumbnail_path}')
    print()

    generate_thumbnail(video_path, thumbnail_path)
    # move the videofile out of new-Folder
    destination_folder = TARGETS["video-move"]
    print(destination_folder)
    shutil.move(video_path, destination_folder)

if __name__ == '__main__':
    main()

Re: Datei löschen nicht möglich

Verfasst: Mittwoch 25. August 2021, 20:45
von Domroon
sparrow hat geschrieben: Mittwoch 25. August 2021, 20:36 Aber du siehst in der Fehlermeldung den Pfad der Datei, die gesperrt ist. Ist das dier Quell- oder die Zieldatei?
Die Datei in diesem Pfad:
PFAD A: 'C:\\Users\\haeus\\workspace\\barn-guard-website\\backend\\video-data\\new\\123.mp4'

soll verschoben werden. Und zwar nach:
PFAD B: 'C:\\Users\\haeus\\workspace\\barn-guard-website\\backend\\video-data\\123.mp4'

Das Verschieben klappt auch. Also die Datei existiert dann auch in Pfad B. Das löschen aus Pfad A klappt dann allerdings nicht, dann kommt die oben gennannte Fehlermeldung.

Re: Datei löschen nicht möglich

Verfasst: Mittwoch 25. August 2021, 20:50
von Domroon
Sirius3 hat geschrieben: Mittwoch 25. August 2021, 20:40 Du mußt die Video-Datei schon auch wieder schließen.

Code: Alles auswählen

import shutil
from pathlib import Path
from moviepy.editor import VideoFileClip
from PIL import Image

BASE_PATH = Path('.') #+ '\\backend'
TARGETS = {
    "video": BASE_PATH / "video-data" / "new",
    "thumbnail": BASE_PATH / "thumbnail_pics",
    "video-move": BASE_PATH / "video-data",
}

def generate_thumbnail(video_path, thumbnail_path):
    with VideoFileClip(video_path) as video:
        frame = video.get_frame(0)
    thumbnail_jpg = Image.fromarray(frame)
    thumbnail_jpg.save(thumbnail_path)

def main():
    # videonames are a random hash number
    video_path = TARGETS["video"] / "123.mp4" 
    thumbnail_path = (TARGETS["thumbnail"] / video_path.name).with_suffix('.jpg')
    print()
    print(f'Get Thumbnail Picture from: {video_path}')
    print()
    print(f'Save Thumbnail Picture at: {thumbnail_path}')
    print()

    generate_thumbnail(video_path, thumbnail_path)
    # move the videofile out of new-Folder
    destination_folder = TARGETS["video-move"]
    print(destination_folder)
    shutil.move(video_path, destination_folder)

if __name__ == '__main__':
    main()
   
Bekommst Du keine Fehlermeldung?
Wenn ich das richtig sehe, dann hast du am Programm nichts verändert, außer das Du es pythonischer und leichter lesbar umgeschrieben hast (danke übrigens dafür :wink: )

Re: Datei löschen nicht möglich

Verfasst: Mittwoch 25. August 2021, 21:02
von Sirius3
Die Video-Datei wird jetzt geschlossen, da with benutzt wird.

Re: Datei löschen nicht möglich

Verfasst: Mittwoch 25. August 2021, 21:19
von Domroon
Sirius3 hat geschrieben: Mittwoch 25. August 2021, 21:02 Die Video-Datei wird jetzt geschlossen, da with benutzt wird.
Mit Deinem Code bekomme ich nun diese Fehlermeldung. Sieht aus wie ein Bug im moviepy-Modul :shock:

Code: Alles auswählen

Traceback (most recent call last):
  File "C:\Users\haeus\workspace\barn-guard-website\backend\thumbnail_test.py", line 36, in <module>
    main()
  File "C:\Users\haeus\workspace\barn-guard-website\backend\thumbnail_test.py", line 29, in main
    generate_thumbnail(video_path, thumbnail_path)
  File "C:\Users\haeus\workspace\barn-guard-website\backend\thumbnail_test.py", line 14, in generate_thumbnail
    with VideoFileClip(video_path) as video:
  File "C:\Users\haeus\AppData\Roaming\Python\Python39\site-packages\moviepy\video\io\VideoFileClip.py", line 88, in __init__
    self.reader = FFMPEG_VideoReader(filename, pix_fmt=pix_fmt,
  File "C:\Users\haeus\AppData\Roaming\Python\Python39\site-packages\moviepy\video\io\ffmpeg_reader.py", line 35, in __init__
    infos = ffmpeg_parse_infos(filename, print_infos, check_duration,
  File "C:\Users\haeus\AppData\Roaming\Python\Python39\site-packages\moviepy\video\io\ffmpeg_reader.py", line 244, in ffmpeg_parse_infos
    is_GIF = filename.endswith('.gif')
AttributeError: 'WindowsPath' object has no attribute 'endswith'

Re: Datei löschen nicht möglich

Verfasst: Mittwoch 25. August 2021, 21:22
von __blackjack__
`VideoFileClip` kommt anscheinend nicht mit `Path`-Objekten klar und erwartet eine Zeichenkette. Also ein `str()` einfügen und gut ist.

Re: Datei löschen nicht möglich

Verfasst: Mittwoch 25. August 2021, 21:57
von Domroon
__blackjack__ hat geschrieben: Mittwoch 25. August 2021, 21:22 `VideoFileClip` kommt anscheinend nicht mit `Path`-Objekten klar und erwartet eine Zeichenkette. Also ein `str()` einfügen und gut ist.
Achso :lol: Danke euch allen :wink: