Datei löschen nicht möglich

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
Domroon
User
Beiträge: 104
Registriert: Dienstag 3. November 2020, 10:27
Wohnort: Dortmund

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()

Benutzeravatar
sparrow
User
Beiträge: 4231
Registriert: Freitag 17. April 2009, 10:28

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?
Benutzeravatar
Domroon
User
Beiträge: 104
Registriert: Dienstag 3. November 2020, 10:27
Wohnort: Dortmund

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
Benutzeravatar
sparrow
User
Beiträge: 4231
Registriert: Freitag 17. April 2009, 10:28

Aber du siehst in der Fehlermeldung den Pfad der Datei, die gesperrt ist. Ist das dier Quell- oder die Zieldatei?
Sirius3
User
Beiträge: 17797
Registriert: Sonntag 21. Oktober 2012, 17:20

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()
Benutzeravatar
Domroon
User
Beiträge: 104
Registriert: Dienstag 3. November 2020, 10:27
Wohnort: Dortmund

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.
Benutzeravatar
Domroon
User
Beiträge: 104
Registriert: Dienstag 3. November 2020, 10:27
Wohnort: Dortmund

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: )
Sirius3
User
Beiträge: 17797
Registriert: Sonntag 21. Oktober 2012, 17:20

Die Video-Datei wird jetzt geschlossen, da with benutzt wird.
Benutzeravatar
Domroon
User
Beiträge: 104
Registriert: Dienstag 3. November 2020, 10:27
Wohnort: Dortmund

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'
Benutzeravatar
__blackjack__
User
Beiträge: 13199
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

`VideoFileClip` kommt anscheinend nicht mit `Path`-Objekten klar und erwartet eine Zeichenkette. Also ein `str()` einfügen und gut ist.
“There will always be things we wish to say in our programs that in all known languages can only be said poorly.” — Alan J. Perlis
Benutzeravatar
Domroon
User
Beiträge: 104
Registriert: Dienstag 3. November 2020, 10:27
Wohnort: Dortmund

__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:
Antworten