Abspeichern in festgelegtem Pfad

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
Faerelis
User
Beiträge: 34
Registriert: Sonntag 20. November 2011, 16:55

Hallo Zusammen,

ich habe mir ein kleines Diary-Programm gebastelt, welches ohne Probleme funktioniert. Es ist ein Ein-Button-Programm welches den geschriebenen Text abspeichert und das Programm beendet. Nun wird aber gerade dort gepeichert wo sich das Script gerade befindet.

Mein Vorhaben: ich möchte, dass das Programm unter einem festen Pfad speichert, z.B. im Dokumentenverzeichnis. Nun ist es aber für mich das Problem das richtige Modul zu finden um das zu realisieren, da ja unter Englisch und Deutsch verschiedene Namen gelten für die gleichen Ordner.

Zusätzlich habe ich auch das Problem nach dem /home-Verzeichnis in die Unterordner zu wechseln, da auch hier die Namen verschieden sein können. Mir fehlt eine Möglichkeit in z.B. /home und ../Dokumente zu navigieren.

Ich habe in das os- und shutil-Modul geschaut, aber keine Möglichkeit gefunden ordentlich zu navigieren.

Z.b.

Code: Alles auswählen

os.path.abspath('Documents') 
gibt immer nur sowas aus

Code: Alles auswählen

 '/home/jason/Documents/Documents'
Damit kann ich nicht arbeiten.

Weiss da jemand Rat?
BlackJack

@Faerelis: Unter Linux gibt es die XDG Base Directory Specification. Da gibt es auch ein paar Module im Python Package Index.
lunar

@Faerelis Unter Windows kannst Du die Pfade solcher Verzeichnisse über die Windows API abfragen, dazu benötigst Du pywin32 oder ctypes (Beispiel).
Faerelis
User
Beiträge: 34
Registriert: Sonntag 20. November 2011, 16:55

Ich nutze Kubuntu und von daher interessiere ich mich mich für diese Lösungen.

Aber mal was anderes, kann ich Scripte für beide Systeme schreiben?

BlackJack; ich habe xdg gefunden, beim Durchschauen der Funktionen - mit denen ich nicht sehr viel anfangen konnte - habe im Modul os environ gefunden, gibt das IMMER den HomeOrdner aus, oder ist da irgend was anderes hinter was ich übersehen habe? dann wäre das was ich gesucht habe, da ich ja daraus alles andere ableiten kann.
Faerelis
User
Beiträge: 34
Registriert: Sonntag 20. November 2011, 16:55

Gelöst, zumindest das was ich wollte, so sieht mein Code aus:

Code: Alles auswählen


...

    def write_down(self):
        time = localtime()
        #hier ein '/' um den Pfad zu vervollständigen...
        filename = '/' + str(time[3]) + '-' + str(time[4]) + ' ' + str(time[2]) + '-' + str(time[1]) + '-' + str(time[0]) + '.txt'
        return filename

    def save_exit(self):
        # ...hier heraus wird der Pfad des HomeOrdners gezogen...
        environment = environ['HOME']
        file_name = self.write_down()
        a = self.text.get('1.0',END)        
        #...und hier wird der Pfad mit dem Namen der Datei implementiert
        file = open(environment + file_name, 'w')
        print(a, end='\n', file=file)
        file.close()
        root.destroy()

...

Aus dem Modul os nehme ich die Funktion environ in der Form (s.o.) und extrahiere daraus den Pfad des HomeOrdner, den ich dann mit dem erzeugten Namen der Datei zusammenfügen in der save_exit-Funktion. Danke @ BlackJack, manchmal ist nur ein kleiner Stupser nötig ;-)
deets

Das kann aber noch deutlich schoener werden. Schau dir mal String-Formatting und die Funktion strftime an, dann gewinnt deine write_down-Funktion deutlich an Aesthetik.
BlackJack

@Faerelis: Pfade sollte man mit `os.path.join()` zusammen setzen und nicht mit hart kodierten '/' und ``+``.

Anstelle von `print()` würde ich zum schreiben in eine Datei die `write()`-Methode des Dateiobjekts verwenden. Und die Datei mit der ``with``-Anweisung öffnen.
Faerelis
User
Beiträge: 34
Registriert: Sonntag 20. November 2011, 16:55

Danke für die echt super Tipps erstmal, hier die verbesserte Version:

Code: Alles auswählen


    def file_name(self):
        environment = environ['HOME']
        time_stamp = time.strftime('%H-%M %d-%m-%Y') + '.txt'
        file_path = path.join(environment, time_stamp)
        return file_path

    def save_exit(self):
        name = self.file_name()
        a = self.text.get('1.0',END)       
        with open(name, 'w') as file:
            file.write(a)
        root.destroy()


Ich weiss ^^ ich könnte, das auch alles in einer Funktion schreiben, aber da ich alles noch erweitern möchte, habe ich der Übersicht wegen das so getrennt.

Aber leider konnte ich das mit dem StringFormatting nicht ganz umsetzen, was soll das bringen?

PS: ich möchte gern ein Ordnersystem erstellen, dass in einem Seperaten Ordner, namens 'Little-Diary' die Einträge noch weiter unterteilt nach Monaten (vllt sogar nach Tagen), könnt Ihr mir da ein Tipp geben wie man das am besten anfängt?
Antworten