Python copyfile funktioniert nicht?

2 Antworten

Vom Beitragsersteller als hilfreich ausgezeichnet

Handelt es sich bei C:\Users\Tim PC\PycharmProjects\MakeBackup\testbackups\17.05.2018 14-26-54 zufälligerweise um ein Verzeichnis?

Wenn ja, dann liegt der Fehler möglicherweise darin, dass shutil.copyfile sowohl für Quelle als auch Ziel einen Dateinamen erwartet.


anonymia1 
Beitragsersteller
 17.05.2018, 17:31

Wäre möglich da dies ein Dateiname ist. Aber wie soll ich dies denn machen? Ich möchte eine Datei in den Ordner C:\Users\Tim PC\PycharmProjects\MakeBackup\testbackups\17.05.2018 14-26-54 kopieren. Soll cih dort einfach eine Datei erstellen und diese ans Ende des Pfades hängen? Falls ja, gäbe es da noch eine andere Möglichkeit?

Isendrak  17.05.2018, 18:01
@anonymia1

Da gibt mehrere Möglichkeiten:

1.) Verwende shutil.copy anstelle von shutil.copyfile

shutil.copy("c:\\foo\\bar.xyz", "c:\\baz\\")

Kopiert die Datei c:\foo\bar.xyz in das Verzeichnis c:\baz\. Am Ende hast du also die Datei c:\foo\bar.xyz und die Kopie c:\baz\bar.xyz.

2.) Häng an den Pfad noch einen Dateinamen an

shutil.copyfile("c:\\foo\\bar.xyz", "c:\\baz\\abc.def")

Kopiert die Datei c:\foo\bar.xyz nach c:\baz\abc.def.

3.) Baste dir eine eigene Kopierfunktion z.B.:

import os
def copy(src, dst, block_size=0xffffff):
    if os.path.isdir(dst): dst = os.path.join(dst, os.path.basename(src))
    elif not os.path.exists(dst):
        os.makedirs(os.path.dirname(dst))
    fsrc = open(src, "rb")
    fdst = open(dst, "wb")
    while True:
        block = fsrc.read(block_size)
        if not block: break
        fdst.write(block)
    fsrc.close()
    fdst.close()

4.) Da gibts noch viele andere... Wer suchet, der findet.

P.S.: Das solltest du ggf. mal lesen: https://docs.python.org/3/library/shutil.html

Isendrak  17.05.2018, 18:16
@Isendrak

Oh verdammt... In meiner Kopierfunktion aus Punkt 3 hatt ich n paar kleine Fehlerchen drin...

Sollte so aussehen:

import os
def copy(src, dst, block_size=0xffffff):
    if os.path.isdir(dst): dst = os.path.join(dst, os.path.basename(src))
    elif not os.path.exists(dst):
        os.makedirs(os.path.dirname(dst))
    fsrc = open(src, "rb")
    fdst = open(dst, "wb")
    while True:
        block = fsrc.read(block_size)
        if not block: break
        fdst.write(block)
    fsrc.close()
    fdst.close()

^^;

Isendrak  17.05.2018, 18:20
@anonymia1

Scheint ja zu laufen. ^^

Aber noch eine Kleinigkeit zu deiner Frage

Soll cih dort einfach eine Datei erstellen und diese ans Ende des Pfades hängen?

Nein, so war das nicht gemeint.

shutil.copyfile erwartet zwar einen Dateinamen für das Ziel, aber die Datei muss nicht zwangsläufig bereits existieren.

Wenn jedoch unter dem als Ziel angegebenen Namen bereits ein Dateisystemobjekt existiert, bei dem es sich um ein Verzeichnis handelt, dann schlägt der Versuch dieses wie eine Datei zu behandeln natürlich fehl.

Und genau das ist bei dir offenbar passiert.

Hast du schonmal versucht das Script mit Root (oder Admin) Rechten auszuführen?

PermissionError: [Errno 13] Permission denied: 'C:\Users\Tim PC\PycharmProjects\MakeBackup\testbackups\17.05.2018 14-26-54'

->

[Errno 13] Permission denied

anonymia1 
Beitragsersteller
 17.05.2018, 17:29

JA habe ich. Die Datei hatt auch die normalen Berechtigungen(Lesen, Schreiben...)