Python copyfile funktioniert nicht?
Ich habe einen Code welcher mir diese Fehlermeldung auswirft. Allerdings komme ich nicht weiter mit der Fehlermeldung. Bei google habe ich leider auch nichts gefunden. Ich hoffe ihr könnt mir helfen.
Fehlercode:
ERROR! Cannot copy files.
Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Users\Tim PC\PycharmProjects\MakeBackup\save.py", line 29, in savedata
copyfile(line.rstrip(), dest + dat)
File "C:\Users\Tim PC\AppData\Local\Programs\Python\Python36-32\lib\shutil.py", line 121, in copyfile
with open(dst, 'wb') as fdst:
PermissionError: [Errno 13] Permission denied: 'C:\Users\Tim PC\PycharmProjects\MakeBackup\testbackups\17.05.2018 14-26-54'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "C:\Users\Tim PC\AppData\Local\Programs\Python\Python36-32\lib\tkinter__init__.py", line 1702, in __call__
return self.func(args) File "C:/Users/Tim PC/PycharmProjects/MakeBackup/main.py", line 116, in <lambda> save_1_button = Button(fenster, text="Save", command=lambda: save.savedata()) File "C:\Users\Tim PC\PycharmProjects\MakeBackup\save.py", line 32, in savedata raise Exception Exception
Quellcode:
https://gist.github.com/McCrafterIV/20388d3a2b8f1519ccc9f1fa811b2f9f
2 Antworten
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.
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
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()
^^;
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
JA habe ich. Die Datei hatt auch die normalen Berechtigungen(Lesen, Schreiben...)
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?