Kopieren mit Datum

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.
Olds
User
Beiträge: 9
Registriert: Dienstag 27. September 2016, 16:48

Sirius3 hat geschrieben:@Olds: wie man ein Datum an einen Datei-/Verzeichnisnamen (aka String) anhängt, habe ich Dir schon im zweiten Post hier im Thread gezeigt. Was hast Du also versucht und was passiert dann (Fehlermeldung?)?

Den werde ich die Zeichen von dir nicht auf die reihe bekommen, ist egal.

Kann ja auch möglich sein, das ich zu Dumm für die Sprache bin oder die Sprache zu Dumm für mich :?:

Oder die Lösung ist so leicht das man es nicht sieht 8)

Ich habe doch geschrieben das habe das ich NEU hier bin, den hättest mir ja auch den ganzen Text schreiben können wenn du so nett gewesen wirst.

Verzeichnis erstellen, habe ich hin bekommen

1 Datei kopieren geht auch und wird auch ersetz ohne Fehler

Verzeichnis wird auch kopiert, es kommt aber zum Fehler wenn das Verzeichnis schon besteht.

Vielleicht sollte ich mal zu einer anderen Sprache schauen, kann ja sein das die mir besser liegt :cry: c , Java, VB, ......
BlackJack

@Olds: Ich weiss nicht ob es in einer anderen Programmiersprache besser läuft. Du fängst gleich mit GUI-Programmierung an, was keine gute Idee ist, weil man dafür eigentlich fortgeschrittener sein muss und objektorientierte Programmierung schon verstanden haben sollte.

Du mischst Hauptprogramm und Funktionsdefinitionen auf Modulebene und verwendest einen Sternchen-Import und globale Variablen. Dazu teils nichtssagende und unsinnigerweise nummerierte Namen. Funktionen werden üblicherweise nach der Tätigkeit benannt die sie durchführen. `dialogx` ist keine Tätigkeit, und wer so einen Funktionsnamen liest hat keine Ahnung wofür der Dialog steht und was darin eingegeben werden kann.

Es werden Werte an Namen gebunden, die danach nie wieder verwendet werden. Auf letzteres angesprochen kam keine Reaktion. Ebenso bei der Nachfrage was Du denn nun genau gemacht hast und welche Fehler genau gekommen sind. Quelltext und 1:1-Kopie des Tracebacks wären hilfreich wenn man dazu etwas sagen können soll. Sonst können wir nur sagen, dass Du wohl irgend etwas falsch machst. Und höchstens raten *was* das genau ist.

Ebenfalls vermischt werden Benutzerinteraktion und die eigentliche Programmlogik. Wenn letzteres in eigenen Funktionen stehen würde, könnte man das ohne in der GUI herumklicken zu müssen, testen.
Olds
User
Beiträge: 9
Registriert: Dienstag 27. September 2016, 16:48

So hier mal mein kleinen Text.

Code: Alles auswählen

import os
from tkinter import *
from tkinter import messagebox
import shutil
from datetime import datetime
from time import mktime
from datetime import date
import time

fenster = Tk()                          # Fenster erstellen
fenster.title("Kopieren")               # Fenster Name
fenster.geometry("275x210+650+250")     # Fenster Größe

datum= (time.strftime("%d.%m.%Y "))
pfad = 'e:/Backi-'+datum             # Verzeichniss erstellen mit Datum
if not os.path.exists(pfad):         # Verzeichniss prüfen
   os.makedirs(pfad)

ori='D:/test.txt'
kopie='E:/Backi-,(+datum")/test.txt'
down='C:/Down-1'
down1='E:/Backi-'

def closewindow():                   # Zuweisung Button Exit
    exit()
    
def dialog2():
    shutil.copy(ori, kopie, )
Button2 = Button(fenster,text="Kopieren von Dateien", command=dialog2) # Erzeugen des Button2
Button2.pack ()

def dialog3():
    shutil.copytree(down, down1,)
Button3 = Button(fenster,text="Verzeichniss Kopieren", command=dialog3) # Erzeugen des Button3
Button3.pack ()

def dialog4():
    messagebox.showinfo("Datum", datum)                    # MessageBox Datum Butten 4
Button4 = Button(fenster,text="Datum",command=dialog4)     # Erzeugen des Button4
Button4.pack ()

Button6 = Button(fenster,text="Exit", command=closewindow) # Erzeugen des Button6
Button6.pack ()

fenster.mainloop()
Das erstellen eines Verzeichnis Backi-29.09.2016 , also mit Datum funktioniert.

Es soll aber Dateien und Verzeichnisse kopiert werden in das Verzeichnis Backi-" Datum " was aber leider nicht passiert, und da liegt das Problem
was muss ich da eintragen damit des alles in das Verzeichnis kopiert wird.

Die Fehler könnt ihr ja schauen wenn ihr es ausführt.

Ee ist noch kein Meister vom Himmel gefallen :mrgreen:
Zuletzt geändert von Anonymous am Donnerstag 29. September 2016, 07:43, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
harryberlin
User
Beiträge: 227
Registriert: Donnerstag 17. Dezember 2015, 12:17

1. code mit code tags einfügen
2. bei kopie ist ein " drin
3. dein programm wird vermutlich niemand testen, wenn schon du zu faul bist, die fehlermeldung hier rein zu kopieren. is schon bissl unverschämt, das auch noch offensichtlich zu machen.
zudem, warum soll ich mir mein intel und nvidia rechner mit daten zu müllen die amd, test, und ein schlechtes datumsformat für ein verzeichnis enthalten?
4. nutz bitte os.path.join() um pfade und dateipfade zu kombinieren.
5. räume bitte mal die ganze importe im kopf auf. nicht alles ist notwendig.
6. kopieren hatten wir erst: viewtopic.php?f=1&t=39097
empty Sig
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

@Olds: Du frägst 5 mal, wie man ein Verzeichnis mit Datum macht, was soll ich da anderes antworten, als dass man das Dir schon ganz am Anfang geschrieben hat. Und siehe da, Zeile 14-17 erzeugt ein Verzeichnis mit Datum. Jetzt solltest Du dieses Wissen aber auf Deine anderen Fälle auch übertragen können und da können wir Dir schlecht helfen. Wenn Du die Zuweisung der Variable kopie anschaust, was fällt Dir da auf? Die Kopie in dialog2 wird schief laufen weil es das Verzeichnis »E:/Backi-,(+datum")« höchst wahrscheinlich nicht gibt. Und natürlich enthält der Verzeichnisnamen kein Datum, ebensowenig down1, wenn Du versuchst in dialog3 ein ganzes Verzeichnis zu kopieren. Raten, Hoffen und Zufall helfen beim Programmieren wenig. Du mußt Dein Problem in Teilprobleme aufteilen, Dateinamen mit Datum definieren und Dateien kopieren, wobei Du schon beide gelöst hast, und dann die Teillösungen zur Gesamtlösung wieder zusammensetzten.
BlackJack

@Olds: Das erstellte Verzeichnis mit dem Datum in Namen enthält am Ende ein Leerzeichen. Soll das so? So etwas nervt Benutzer weil man das nicht sieht wenn man beispielsweise nur das Verzeichnis auflistet in dem dieses Verzeichnis liegt.

Wie schon mal gesagt: Lass den ganzen GUI-Kram erst einmal weg und löse das eigentliche Problem mit Hilfe von Funktionen. Also nicht nur Funktionen benutzen, sondern auch den eigenen Code sinnvoll auf Funktionen verteilen. Wenn das dann läuft, kann man eine GUI drauf setzen die diese Funktionen verwendet. Du versuchst hier zu viel auf einmal zu lösen.

Bei Datumsangaben in Dateinamen hat sich das '%Y-%m-%d'-Format bewährt. Das ist nicht nur ein ISO-Standard sondern hat auch noch die angenehme Eigenschaft, dass die Pfade zeitlich in der richtigen Reihenfolge liegen wenn man sie alphabetisch sortiert. Das ist bei '%d.%m.%Y' nicht der Fall. Da werden erst die gleichen Tage aller Monate und Jahre gruppiert, innerhalb dieser Tage nach Monaten, und dann erst nach Jahr. Das ist üblicherweise nicht das was man haben will, nämlich das Sicherungen die zeitlich aufeinanderfolgen auch in der Verzeichnisauflistung aufeinanderfolgen.

Die `exit()`-Funktion sollte man explizit aus `sys` importieren, weil die so nicht dokumentiert ist. Sie ist hier sowieso etwas hart, denn eigentlich möchte man an der Stelle bloss die Tk-Hauptschleife mit der `quit()`-Methode auf `Widget`-Objekten beenden, oder das Fenster mit der `destroy()`-Methode zerstören. Die Funktion heisst ja auch `closewindow()` und nicht `exit_program()`. Den Prozess mit `sys.exit()` beenden sollte man nur im Hauptprogramm tun, und da eigentlich auch nur wenn man dem Aufrufer einen anderen Rückgabecode als 0 liefern möchte. Sonst ist es besser wenn das Programm einfach dadurch endet, dass der Programmfluss am Ende angekommen ist.

Namen! Man kann gar nicht genug betonen wie wichtig gute Namen sind! `ori` ist kein guter Name, sowie `down` und `down1` keine guten Namen sind. Namen helfen dem Leser beim verstehen des Programms. Der Leser ist oft der Programmierer selber nach ein paar Monaten, wenn nicht mehr im Gedächtnis ist wie das alles genau funktioniert was er da geschrieben hat. Quelltext wird öfter gelesen als geschrieben, darum ist es wichtig es sich nicht beim Schreiben möglichst leicht zu machen, sondern es so zu schreiben, das es gut lesbar und verständlich ist. Kryptische Abkürzungen und andere schlechte oder gar falsche Namen sind dabei Gift.

Ich hatte es ja schon mal geschrieben: Nummerierte Namen sind fast immer schlecht. Das ist in aller Regel ein Zeichen, dass man sich keine Gedanken um einen passenden Namen gemacht hat, oder das man eigentlich eine Datenstruktur statt einzelner Namen verwenden wollte. Meistens eine Liste. Also immer wenn Du eine Nummer an einen Namen hängen willst, lass es bleiben und denk darüber nach was Du stattdessen machst.
Antworten