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

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?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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

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.
[size=84][url=http://de.wikipedia.org/wiki/Jamba]Love Jamba[/url] <!--Olliminatore-->input<?/> [url=http://www.spreeblick.com/blog/index.php?p=324]Boycott Jamba[/url][code]def olliminiert(optimiert, eliminiert, terminiert):[/code][/size]
Hannes99

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...
Olliminatore
User
Beiträge: 55
Registriert: Montag 30. Mai 2005, 16:03
Wohnort: schönsten Stadt Deutschlands
Kontaktdaten:

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.
[size=84][url=http://de.wikipedia.org/wiki/Jamba]Love Jamba[/url] <!--Olliminatore-->input<?/> [url=http://www.spreeblick.com/blog/index.php?p=324]Boycott Jamba[/url][code]def olliminiert(optimiert, eliminiert, terminiert):[/code][/size]
BlackJack

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!)
Olliminatore
User
Beiträge: 55
Registriert: Montag 30. Mai 2005, 16:03
Wohnort: schönsten Stadt Deutschlands
Kontaktdaten:

:shock: Ich denke eval() hat ein Recht nicht vergessen zu werden.
Aber einverstanden. :mrgreen: *pickle studier*
[size=84][url=http://de.wikipedia.org/wiki/Jamba]Love Jamba[/url] <!--Olliminatore-->input<?/> [url=http://www.spreeblick.com/blog/index.php?p=324]Boycott Jamba[/url][code]def olliminiert(optimiert, eliminiert, terminiert):[/code][/size]
jAN
User
Beiträge: 170
Registriert: Samstag 4. Juni 2005, 18:51
Wohnort: Großmehlra (in Thüringen)
Kontaktdaten:

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
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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?

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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 (former) Modvoice
Hannes99

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

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