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.
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

@BlackJack: Ich sehe schon, ich habe mächtig Fehler eingehandelt. Mein Anliegen war es ja, dass die Datei, die kopiert, und in den entsprechenden Ordner eingefügt wird, auch den richtigen Namen bekommt. Es kann ja sein, dass man von der INI-Datei eine Sicherungskopie macht, und sie dann von mir aus "config_original.ini" benennt, und diese dann auf dem Desktop speichert. Wenn der Anwender diese Datei durch QFileDialog diese Datei aus dem Desktop aussucht, so kopiert Python diese Datei zum vorgesehenen Ordner. Und im Anschluß soll die Datei so umbenannt werden, das Python auch damit arbeiten kann, da der Name der Datei hart kodiert im Quelltext hinterlegt ist. Ich hatte ja auch die Idee, irgendwie an den Dateinamen direkt ranzukommen, nachdem der Anwender die Datei ausgesucht hat, diesen Namen dann in eine Variable speichern und nach dem Kopiervorgang dann abgleichen und gegebenenfalls umzubenennen. Aber irgendwie will es mir nicht sonderlich klappen. Daher habe ich diese Funktion konstruiert.
BlackJack

@Sophus: Das erscheint mir alles sehr umständlich. Warum gibst Du nicht gleich beim kopieren schon den neuen/festen Namen als Zielnamen an? Dann kann man sich das extra umbenennen sparen.
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

@BlackJack: Weil ich Angst hatte, dass die originale Datei umbenannt wird, und nicht die, die kopiert werden soll. Wenn ich dich also richtig verstehe, so soll die os.rename()-Methode gleich direkt in der copy_ini_file-Funktion angelegt werden? Ich werde mal schauen, wie ich das machen kann.
BlackJack

@Sophus: Du brauchst gar kein `os.rename()`. Nochmal: Als Ziel den Zieldateinamen gleich so angeben wie er am Ende aussehen soll.
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

@BlackJack: Jetzt sag nicht, etwa so?

Code: Alles auswählen

    def copy_ini_file(self):
        self.setting_folder = os.path.abspath(os.path.join('settings', 'config.ini'))
        print "setting_folder: ", self.setting_folder
        try:
            shutil.copy2(unicode(self.inputfile), unicode(self.setting_folder))
            print "File was copied"
        except shutil.Error as e:
            print('Error (shutil.Error): %s' % e)
        except IOError as e:
            print('Error (IOError): %s' % e.strerror)
In Zeile 2 habe ich den Dateinamen festgelegt. Wenn es das ist was du meintest, dann renn ich schreiend vor die Tür. Weil ich vollkommen anders dachte, und zwar, dass Python auf diesem Weg eine neue Datei anlegt, wenn sie nicht vorhanden ist, und nicht die ursprüngliche Datei kopiert und in einem Rutsch umbenennt. Deswegen dachte ich, ich werde erst einmal kopieren, und dann umbenennen, damit ich auch sicher gehen kann, dass auch die Datei umbenannt und nicht neu erstellt wurde.
BlackJack

@Sophus: Ja so war das gedacht. Und `shutil.copy2()` legt natürlich eine neue Datei an wenn die noch nicht existiert — und kopiert dort den Inhalt von der Zieldatei hinein.

`setting_folder` ist als Name dafür jetzt natürlich unpassend und an `self` sollte man das sowieso nicht binden an der Stelle.

Das ``print`` am Ende vom ``try``-Block würde ich in einen ``else``-Zweig verschieben, denn *das* könnte auch die Ursache eines `IOError` sein. Wobei auch hier die Fehlerbehandlung IMHO fragwürdig ist weil sie nur Ausgaben macht die am Ende wahrscheinlich kein GUI-Benutzer sieht und ansonsten ignoriert das etwas nicht funktioniert hat.
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

@BlackJack: Die Print-Ausgaben sind erst einmal für mich, damit ich in der Konsole sehen kann arbeiten kann. Das am Ende Messageboxen oder dergleichen an der Stelle anrücken müssen, ist mir auch klar :-) Und setting_folder habe ich deswegen an self gebunden, weil ich auch außerhalb der Funktion auf die Variable zugreifen möchte. Ansonsten wäre setting_folger eine lokale Variable und ich könnte damit in anderen Funktionen nicht arbeiten. Mhmh.
BlackJack

@Sophus: Das wäre dann ein konstanter Wert der erst vorhanden ist nachdem man eine bestimmte Methode aufgerufen hat. Was komisch bis fehleranfällig ist. EyDu ist das ja auch schon aufgefallen. Das Kriterium für ein Attribut ist nicht ob man den Wert in einer anderen Methode braucht sondern ob der tatsächlich logisch zum Zustand des Objekts gehört. Sonst hat man schnell das Äquivalent eines Moduls mit Funktionen die ``global`` verwenden um Werte auszutauschen, statt über Argumente und Rückgabewerte zu kommunizieren und das Programm so leichter nachvollziehbar und testbar zu machen.
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

@BlackJack: Mit anderen Worten, die konstanten Werten auf Modul-Ebene verschieben, um diesen Wert als Konstante zu behandeln?
Antworten