Seite 1 von 1

Datei kopieren

Verfasst: Montag 26. Februar 2007, 00:03
von sauerkraut
Hallo zusammen,

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

Verfasst: Montag 26. Februar 2007, 01:14
von BlackJack
Das geht zum Beispiel mit `shutil.copy()`.

Verfasst: Montag 26. Februar 2007, 10:46
von sauerkraut
Könnte ich da bitte ein Code Beispiel haben?

Verfasst: Montag 26. Februar 2007, 11:02
von EnTeQuAk
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

Verfasst: Montag 26. Februar 2007, 11:37
von sauerkraut
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))

Verfasst: Montag 26. Februar 2007, 11:55
von Masaru
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.

Verfasst: Dienstag 27. Februar 2007, 17:33
von sauerkraut

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?

Verfasst: Dienstag 27. Februar 2007, 17:42
von Dill
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

Verfasst: Dienstag 27. Februar 2007, 18:13
von CM
kleiner Nachtrag: Das 'r' steht für raw string.

Gruß,
Christian