Verzeichnisse 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.
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Np ;)

Ich habs vorher vergessen zu schreiben, In: A byte of Python, ist ein Beispielcode zum Backups machen (http://abop-german.berlios.de/read/the-solution.html).

Man sollte os.system mit subprocess.call oder subprocess.Popen ersetzten
the more they change the more they stay the same
Py-Prog
User
Beiträge: 673
Registriert: Dienstag 16. Februar 2010, 17:52
Wohnort: G:\ermany

Also dass mit dem einlesen der variablen Pfad und Ziel aus den Dateien hab ich hingekriegt aber jetzt geht die funktion zum kopieren nicht:

Code: Alles auswählen

def Kopieren(path, ziel):
    for i in os.listdir(path):
        if os.path.isdir(path+i) and os.path.exists(ziel+i) == False:
            os.mkdir(ziel+i)
            Kopieren(path+i, ziel+i)
        elif os.path.isdir(path+i) and os.path.exists(ziel+i):
            Kopieren(path+i, ziel+i)
        elif os.path.isfile(path+i):
            filesave(ziel+i, fileopen(path+i))
        else:
            print(i)
mit print(i) sieht man alle Verzeichniste/Dateien die nicht kopiert wurden. (Also alle)
Technik ist: wenn alles funktioniert und keiner weiß warum.
Wer Rechtschreibfehler findet darf sie behalten.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Pfade nicht per "+" sondern mit os.path.join() zusammensetzen.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
BlackJack

Pfade setzt man nicht mit ``+`` zusammen. Schau Dir doch einfach mal an was *dabei* herauskommt, dann sollte klar sein warum keine der Bedingungen zutrifft. Und `i` ist ein sehr schlechter Name für eine Zeichenkette.
Py-Prog
User
Beiträge: 673
Registriert: Dienstag 16. Februar 2010, 17:52
Wohnort: G:\ermany

Last mich raten ich hab (wieder mal) vergessen das da noch '\\' dazugehört.
Technik ist: wenn alles funktioniert und keiner weiß warum.
Wer Rechtschreibfehler findet darf sie behalten.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Py-Prog hat geschrieben:Last mich raten ich hab (wieder mal) vergessen das da noch '\\' dazugehört.
Nein du sollst nicht raten, genauso solltest du keine Zeichen in den Quelltext streuen und hoffen dass es klappt, sondern einfach anschauen, was da steht (`print`, `logging`, `Debugger`, ...) dir dann ueberlegen wie es dazu kam und dann das richtige Gegenmittel waehlen.
Da ist keine Magie dabei.
Py-Prog
User
Beiträge: 673
Registriert: Dienstag 16. Februar 2010, 17:52
Wohnort: G:\ermany

Ha, eigentlich geht es aber mich würde nur noch interesieren warum sind viele (nicht alle) dateien 0kb groß (also leer)?
Das ist die Fehlermeldung:

Code: Alles auswählen

Traceback (most recent call last):
  File "C:\Dokumente und Einstellungen\Adrian\Desktop\Fastbackup.auto.pyw", line 91, in <module>
    backup('D:\\Py-Prog\\Python\\Projekte\\Backup\\Backupinfo\\')
  File "C:\Dokumente und Einstellungen\Py-Prog\Desktop\backup.auto.pyw", line 36, in backup
    Kopieren(Pfad, Ziel)
  File "C:\Dokumente und Einstellungen\Py-Prog\Desktop\Fastbackup.auto.pyw", line 87, in Kopieren
    Kopieren(path+'\\'+i, ziel+'\\'+i)
  File "C:\Dokumente und Einstellungen\Py-Prog\Desktop\backup.auto.pyw", line 87, in Kopieren
    Kopieren(path+'\\'+i, ziel+'\\'+i)
  File "C:\Dokumente und Einstellungen\Py-Prog\Desktop\backup.auto.pyw", line 87, in Kopieren
    Kopieren(path+'\\'+i, ziel+'\\'+i)
  File "C:\Dokumente und Einstellungen\Py-Prog\Desktop\backup.auto.pyw", line 89, in Kopieren
    filesave(ziel+'\\'+i, fileopen(path+'\\'+i))
  File "C:\Dokumente und Einstellungen\Py-Prog\Desktop\backup.auto.pyw", line 68, in fileopen
    dtt=f.read()
  File "C:\Python31\lib\encodings\cp1252.py", line 23, in decode
    return codecs.charmap_decode(input,self.errors,decoding_table)[0]
UnicodeDecodeError: 'charmap' codec can't decode byte 0x9d in position 320: character maps to <undefined>
(kommt nur wein ich bei fileopen() die try: anweisung weglasse.
Technik ist: wenn alles funktioniert und keiner weiß warum.
Wer Rechtschreibfehler findet darf sie behalten.
BlackJack

@Py-Prog: Am Traceback sieht man ziemlich deutlich, dass Du nicht `os.path.join()` verwendest sondern jetzt ``pfad + '\\' + i`` -- sag mal warum sollte man Dir noch helfen wollen, wenn Du entgegen der Ratschläge doch alles ganz furchtbar anders machst!?
Py-Prog
User
Beiträge: 673
Registriert: Dienstag 16. Februar 2010, 17:52
Wohnort: G:\ermany

@BlackJack ich hab's jetzt mit join gemacht und jetzt kommt aber wieder das gleiche, nur mit den kleinen änderungen.
Technik ist: wenn alles funktioniert und keiner weiß warum.
Wer Rechtschreibfehler findet darf sie behalten.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Py-Prog hat geschrieben:

Code: Alles auswählen

  File "C:\Dokumente und Einstellungen\Py-Prog\Desktop\backup.auto.pyw", line 68, in fileopen
    dtt=f.read()
  File "C:\Python31\lib\encodings\cp1252.py", line 23, in decode
    return codecs.charmap_decode(input,self.errors,decoding_table)[0]
UnicodeDecodeError: 'charmap' codec can't decode byte 0x9d in position 320: character maps to <undefined>
Kann es sein, dass du aus irgendeinem kuriosen Grund versuchst, den Dateiinhalt selber auszulesen und zu schreiben, statt die passenden Funktionen aus der Python-Library zu verwenden?
Py-Prog
User
Beiträge: 673
Registriert: Dienstag 16. Februar 2010, 17:52
Wohnort: G:\ermany

Wenn du meinst das ich für das öffnen und speichern eine eingene funktion definiert hab dan ja.
Technik ist: wenn alles funktioniert und keiner weiß warum.
Wer Rechtschreibfehler findet darf sie behalten.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Und warum oeffnest du die Dateien, wenn du sie eigtl kopieren willst? Es gibt schliesslich `shutil`, `os`, ... _darauf_ wollte /me raus

Warum du das benutzen willst ist folgendes: Wenn du die Dateien als Textdateien öffnest, wird der Inhalt zu Unicode-Objekten dekodiert, da du die Dateien nicht explizit mit einem Encoding oeffnest (zb mit `codecs.open`) wird mit dem System-Encoding gearbeitet: `cp1252`. Deine Dateien scheinen inkompatible Encodings (z.b. UTF-8 oder UTF-16) zu nutzen und dann ergibt sich dein Fehler.
Wenn du die Schrotflinte nicht von deinen Beinen wegbewegen willst und das lieber weiterhin zu Fuss erledigst, solltest du die Dateien wenigstens als Binaerdatei oeffnen um nicht alles kaputt zu machen.
Py-Prog
User
Beiträge: 673
Registriert: Dienstag 16. Februar 2010, 17:52
Wohnort: G:\ermany

@cofi Danke es geht jetzt.
Technik ist: wenn alles funktioniert und keiner weiß warum.
Wer Rechtschreibfehler findet darf sie behalten.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Py-Prog hat geschrieben:@cofi Danke es geht jetzt.
Wie hast Du es denn jetzt gelöst? Ich hoffe mal mit den dafür gedachten Funktionen :-D
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Py-Prog
User
Beiträge: 673
Registriert: Dienstag 16. Februar 2010, 17:52
Wohnort: G:\ermany

Nein ich hab's doch nicht (ganz) gelöst, einmal hat's geklapt alle bilder sind am ziel angekommen aber beim zweiten mal kommt das:

Code: Alles auswählen

IOError: [Errno 13] Permission denied:
(Ich hab's nicht mit shutil gemacht sondern einfach in meinen funktionen das

Code: Alles auswählen

f=open(path, 'r')
mit

Code: Alles auswählen

f=open(path, 'rb')
ausgetauscht und das bein speichern natülich auch. (shutil nim ja das gleiche her also ist's doch egal)
Technik ist: wenn alles funktioniert und keiner weiß warum.
Wer Rechtschreibfehler findet darf sie behalten.
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Oh mann, dir ist schon klar, dass du alle Metadaten verlierst? <ironie>Und warum, gibt es in der std. nur das Modul shutil, es ist doch völlig wertlos?</ironie>

Btw. es wurden dir schon gute Wege gennant um das Problem zu lösen, z.b. Post #2 von lunar: shutil.copytree
the more they change the more they stay the same
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Py-Prog hat geschrieben:

Code: Alles auswählen

f=open(path, 'rb')
ausgetauscht und das bein speichern natülich auch. (shutil nim ja das gleiche her also ist's doch egal)
Woher weißt Du das? Quelle?
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Code: Alles auswählen

def copyfile(src, dst):
    """Copy data from src to dst"""
    if _samefile(src, dst):
        raise Error("`%s` and `%s` are the same file" % (src, dst))

    with open(src, 'rb') as fsrc:
        with open(dst, 'wb') as fdst:
            copyfileobj(fsrc, fdst)

def copyfileobj(fsrc, fdst, length=16*1024):
    """copy data from file-like object fsrc to file-like object fdst"""
    while 1:
        buf = fsrc.read(length)
        if not buf:
            break
        fdst.write(buf)
Weil es (oberflaechlich) so ist (Python 2.6 Code). Allerdings nur bei `shutil.copyfile` _UND_ die Doku erwaehnt das da auch ausdruecklich, alle anderen `copy` Funktionen kuemmern sich um mehr.
Py-Prog
User
Beiträge: 673
Registriert: Dienstag 16. Februar 2010, 17:52
Wohnort: G:\ermany

Hyperion hat geschrieben:
Py-Prog hat geschrieben:

Code: Alles auswählen

f=open(path, 'rb')
ausgetauscht und das bein speichern natülich auch. (shutil nim ja das gleiche her also ist's doch egal)
Woher weißt Du das? Quelle?
Na ja, ich schau mir gern mal die Dateien der Module an und da hab ich bei shutil das gefunden. Was wundert dich das so? (vieleicht weil ich sonst dumme frage stelle wie man wirgendwas macht?)
Technik ist: wenn alles funktioniert und keiner weiß warum.
Wer Rechtschreibfehler findet darf sie behalten.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Py-Prog hat geschrieben: Na ja, ich schau mir gern mal die Dateien der Module an und da hab ich bei shutil das gefunden. Was wundert dich das so? (vieleicht weil ich sonst dumme frage stelle wie man wirgendwas macht?)
Ist bei Anfängern eher selten der Fall - zumal das ganze Prozedere sonderbar ist, da Du ja das Modul offensichtlich evaluiert hast, es aber dennoch nicht nutzt! :twisted:
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Antworten