Speichern und laden?

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.
Hannes99

Speichern und laden?

Beitragvon Hannes99 » Dienstag 28. Juni 2005, 17:41

Hallo,

wie kann ich unter Python z.b. eine Liste in ein Textdokument speicher und es dann später und in einer anderen Python-Datei wieder laden und damit weiterarbeiten?
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Dienstag 28. Juni 2005, 18:13

Das ist mit YAML (habe damit gute Erfahrungen gemacht) oder JSON überhaupt kein Problem.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
Olliminatore
User
Beiträge: 55
Registriert: Montag 30. Mai 2005, 16:03
Wohnort: schönsten Stadt Deutschlands
Kontaktdaten:

Beitragvon Olliminatore » Dienstag 28. Juni 2005, 19:32

Sehr interessant Leonidas.

Ich habe das mal so gemacht:

Code: Alles auswählen

Line=0
Data[Line]=[repr(Liste)+'\n']    #list to string
f = open('Textdokument', 'w+')
f.writelines(Data)
f.close()

#-- other Modul --
Data = open('Textdokument', 'r+').readlines()
ListData = Data.pop(Line)
Liste = eval(ListData.rstrip('\n'))    #string to list

Der String wird wieder zu einer echten Liste umgewandelt.
Love Jamba <!--Olliminatore-->input<?/> Boycott Jamba

Code: Alles auswählen

def olliminiert(optimiert, eliminiert, terminiert):
Hannes99

Beitragvon Hannes99 » Dienstag 28. Juni 2005, 20:17

Olliminatore hat geschrieben:Sehr interessant Leonidas.

Ich habe das mal so gemacht:

Code: Alles auswählen

Line=0
Data[Line]=[repr(Liste)+'\n']    #list to string
f = open('Textdokument', 'w+')
f.writelines(Data)
f.close()

#-- other Modul --
Data = open('Textdokument', 'r+').readlines()
ListData = Data.pop(Line)
Liste = eval(ListData.rstrip('\n'))    #string to list

Der String wird wieder zu einer echten Liste umgewandelt.




Hallo.
Vielen Dank erstmal, aber ich verstehe deinen Vorschlag noch nicht so ganz...
Benutzeravatar
Olliminatore
User
Beiträge: 55
Registriert: Montag 30. Mai 2005, 16:03
Wohnort: schönsten Stadt Deutschlands
Kontaktdaten:

Beitragvon Olliminatore » Dienstag 28. Juni 2005, 20:53

Oh* habe einen kleinen Fehler eingebaut.
Da Data "auch" schon eine Liste ist, muss Zeile 2 so aussehen:

Code: Alles auswählen

Data[Line]=repr(Liste)+'\n'    #list to string

Du kannst es auch ohne writelines(), readlines() machen, im Prinzip wollte ich nur ein Beispiel mit repr(), eval() darstellen.
Love Jamba <!--Olliminatore-->input<?/> Boycott Jamba

Code: Alles auswählen

def olliminiert(optimiert, eliminiert, terminiert):
BlackJack

Beitragvon BlackJack » Dienstag 28. Juni 2005, 21:55

Und das `eval()` vergessen wir jetzt ganz schnell wieder, weil es in diesem einfachen Fall eine unnötige Sicherheitslücke darstellt. Man stelle sich nur einmal vor die Textdatei enthält folgendes:

Code: Alles auswählen

import os
os.system(os.path.expanduser('rm -rf ~'))


Oder einen entsprechend verheerenden Befehl für Windows/MacOS/...

Wenn die Daten komplexer werden und keine Interoperabilität mit anderen Programmen bzw. Programmiersprachen bestehen muss, dann ist das `pickle` Modul wohl die einfachste Lösung Daten auf die Platte rauszuschreiben und später wieder einzulesen ohne sich um das Format kümmern zu müssen. (Nicht vegessen die Dateien immer als Binärdateien zu öffnen!)
Benutzeravatar
Olliminatore
User
Beiträge: 55
Registriert: Montag 30. Mai 2005, 16:03
Wohnort: schönsten Stadt Deutschlands
Kontaktdaten:

Beitragvon Olliminatore » Mittwoch 29. Juni 2005, 10:46

:shock: Ich denke eval() hat ein Recht nicht vergessen zu werden.
Aber einverstanden. :mrgreen: *pickle studier*
Love Jamba <!--Olliminatore-->input<?/> Boycott Jamba

Code: Alles auswählen

def olliminiert(optimiert, eliminiert, terminiert):
jAN
User
Beiträge: 170
Registriert: Samstag 4. Juni 2005, 18:51
Wohnort: Großmehlra (in Thüringen)
Kontaktdaten:

Beitragvon jAN » Mittwoch 29. Juni 2005, 15:10

hi hannes!
pickle ist ein sehr schones modul zum speichern von daten
man erzeugt einen Pickler()
und mit dem kann man dann in die datei schreiben (dump)

Code: Alles auswählen

from pickle import *
f=file(path,'w')
p=Pickler(f)
p.dump(data)
f.close()

und zum entpacken:

Code: Alles auswählen

from pickle import *
f=file(path,'w')
p=Unpickler(f)
data=p.load()
f.close()

es gibt auch cPickle
das ist komplett in C geschrieben und deutlich schneller
gruß jAN

Edit (Leonidas): Code in Python-Tags gesetzt.
Benutzeravatar
jens
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Beitragvon jens » Mittwoch 29. Juni 2005, 15:17

Wobei es geht auch so:

Code: Alles auswählen

import pickle

f=file(path,'w')
f.write( pickle.dumps(daten) )
f.close()


Code: Alles auswählen

import pickle

f=file(path,'r')
daten = pickle.loads( f.read() )
f.close()


Ist es dabei wirklich wichtig die Datei im Binary Modus zu öffnen??? Ich denke nicht, da es ja serialisierter Text ist, oder?

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Mittwoch 29. Juni 2005, 19:45

jens hat geschrieben:Ist es dabei wirklich wichtig die Datei im Binary Modus zu öffnen??? Ich denke nicht, da es ja serialisierter Text ist, oder?


Nein, nur Protokoll 0, die Protokolle 1 & 2 sind binär.

Deswegen wenn ich etwas dumpen oder laden möchte, das der User bearbeiten kann, nehme ich YAML/JSON.

Edit: Da alle hier Code posten mache ich mit:

Code: Alles auswählen

#!/usr/bin/env python
# -*- encoding: latin-1 -*-
import yaml
filename = 'textdump.yaml'

def dump(obj):
    f = file(filename, 'w')
    d = yaml.dump(obj)
    f.write(d)
    f.close()

def load():
    obj = yaml.loadFile(filename)
    for item in obj:
        return item

def main():
    daten = {'Eine Liste' : ['a', 'b', 'c'],
        'In einem Dict' : 'finde ich sehr praktisch'}
    print daten
    dump(daten)
    print load()

if __name__ == '__main__':
    main()


generiert folgende Datei:

Code: Alles auswählen

---
Eine Liste:
    - a
    - b
    - c
In einem Dict: finde ich sehr praktisch
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Hannes99

Beitragvon Hannes99 » Mittwoch 29. Juni 2005, 20:17

Vielen Dank euch allen.
Ich werde alles ausprobieren :) und schauen, welches in mein Projekt am besten passt :)

Echt klasse dieses Forum, man bekommt immer Hilfe, auch als Anfänger.
BlackJack

Beitragvon BlackJack » Mittwoch 29. Juni 2005, 21:24

Leonidas hat geschrieben:
jens hat geschrieben:Ist es dabei wirklich wichtig die Datei im Binary Modus zu öffnen??? Ich denke nicht, da es ja serialisierter Text ist, oder?


Nein, nur Protokoll 0, die Protokolle 1 & 2 sind binär.


Das Protokoll 0 ist etwas unglücklich als "Text" benannt -- auch das ist binär! Die Daten müssen ohne Veränderungen durch das Betriebssystem geschrieben und gelesen werden wenn sie unter Plattformen austauschbar sein sollen. Und das geht bei Text nicht, weil Windows zum Beispiel aus einem einzelnen '\n' beim Schreiben von Textdateien '\r\n' macht. Das lässt sich dann zwar unter Windows auch wieder lesen, aber unter MacOS und Linux nicht.

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot]