Datei kopieren

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
sauerkraut
User
Beiträge: 13
Registriert: Montag 26. Februar 2007, 00:01

Hallo zusammen,

bin blutiger Python Anfänger 8) wie kann ich eine Datei in ein anderes Verzeichnis kopieren?
BlackJack

Das geht zum Beispiel mit `shutil.copy()`.
sauerkraut
User
Beiträge: 13
Registriert: Montag 26. Februar 2007, 00:01

Könnte ich da bitte ein Code Beispiel haben?
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

Einfach mal ein wenig in der Dokumentation stöbern, hilft ungemein:

http://docs.python.org/lib/module-shutil.html

ein weiteres Beispiel währe folgendes:
http://docs.python.org/lib/shutil-example.html


MfG EnTeQuAk
sauerkraut
User
Beiträge: 13
Registriert: Montag 26. Februar 2007, 00:01

Hab jetzt das Beispiel verwendet, aber irgendwie passiert da nichts. Ich kriege da nur die Meldung 'returned exit code 0'

Code: Alles auswählen

import string, os, sys, locale
import win32com.client


def copytree(src, dst, symlinks=0):
    src = "C:/Programme/test.txt"
    dst = "C:/Programme/test/test.txt"
    names = os.listdir(src)
    os.mkdir(dst)
    for name in names:
        srcname = os.path.join(src, name)
        dstname = os.path.join(dst, name)
        try:
            if symlinks and os.path.islink(srcname):
                linkto = os.readlink(srcname)
                os.symlink(linkto, dstname)
            elif os.path.isdir(srcname):
                copytree(srcname, dstname, symlinks)
            else:
                copy2(srcname, dstname)
        except (IOError, os.error), why:
            print "Can't copy %s to %s: %s" % (`srcname`, `dstname`, str(why))
Benutzeravatar
Masaru
User
Beiträge: 425
Registriert: Mittwoch 4. August 2004, 22:17

Du importierst zum einen nirgendwo "shutil".
Und die Methoden "copytree" und "copy2" kommen nunmal aus "shutil".

Versuch mal folgendes:
- schreibe mit in den import-Bereich: import shutil
- schreibe vor "copytree" [8] und "copy2" [20]: shutil.

Und anstelle "os.error" kannst Du "OSError" catchen (namentlich vielleicht etwas näher am Standard).

Achja .. und gaaaanz wichtig, Dein Script wird wohl immer ohne einen Durchlauf der copytree Methode sich mit ExitCode 0 beenden, weil Du zwar die Methode copytree in Zeile 5 definierst sie jedoch aus der direkt ausführbaren Modulebene nicht aufrufst ;).

Eine Methode wird nur durchlaufen wenn sie auch aufgerufen wird.

Schreibe am besten hierfür an das Ende Deiner Script-Datei folgendes:

Code: Alles auswählen

if __name__ == '__main__':
    src_dir = r'c:\Programme\test.txt'
    dst_dir = r'c:\Programme\test\test.txt'
    copytree(src_dir, dst_dir)
Was dann passiert ist, dass wenn Du Dein geschriebenes Modul direkt aus der CommandShell aufrufst, die Methode "copytree" mit den im If-Block definierten Testdaten aufgerufen wird.

Würdest Du Dein Module hingegen in einem anderen Python Script/Modul/etc. importieren, so würde dieser If-Block nicht durchlaufen werden, da dann "__name__" eben nicht "__main__" ist :D.

Noch als Tipp ... du solltest die eingehenden Methodenparameter "src" und "dst" nicht unbedingt nochmal in Deiner Methode überschreiben (Zeile: 6, 7). Für ein Testszenario oder auch einem gescripteten Ablauf, kann man wie gesagt besser in einem "if __name__ == '__main__:'" Block die (Tests)Daten definieren (oder eine andere Methode aufrufen) die dann auf die generische Methode abgefeuern.
sauerkraut
User
Beiträge: 13
Registriert: Montag 26. Februar 2007, 00:01

Code: Alles auswählen

if __name__ == '__main__':
    src_dir = r'c:\Programme\test.txt'
    dst_dir = r'c:\Programme\test\test.txt'
    copytree(src_dir, dst_dir)
mal ne blöde frage? wofür steht denn das 'r' und muss ich das verwenden oder gibt es da auch noch andere möglichkeiten?
Benutzeravatar
Dill
User
Beiträge: 470
Registriert: Mittwoch 10. Januar 2007, 14:52
Wohnort: Köln

der backslash ist der escape char in python.
damit werden sonderzeichen eingeleitet, zb \n (new line)

daher wäre folgender string : "c:\name" kein pfad, sondern sowas:

c:
ame

du müsstest also den backslash selbst escapen: "c:\\name"

mit einem r vor dem string musst du die \ nicht escapen:

Code: Alles auswählen

>>> s="c:\name"
>>> s
'c:\name'
>>> print s
c:
ame
>>> s=r'c:\name'
>>> s
'c:\\name'
>>> print s
c:\name
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

kleiner Nachtrag: Das 'r' steht für raw string.

Gruß,
Christian
Antworten