Dateiinhalt in eine Liste

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
beuzel
User
Beiträge: 1
Registriert: Mittwoch 6. August 2008, 13:00

Hallo,

Ich möchte eine sehr kleine Liste in einer Textdatei abspeichern und wieder laden. Bisher funktioniert Folgendes:

Code: Alles auswählen

a={'a':(2,4),'b':(4,5)}
file = open(fileName,"w")
file.write(str(aniClipRanges))
file.close()	
und zum Einlesen

Code: Alles auswählen

file = open(fileName,"r")
a = eval(file.read())
file.close()
Die Datei sieht dann ungefähr so aus:
{u'a': (2, 4), u'b': (4, 5)}

Nur werden alle Daten in eine Zeile geschrieben. Ich brauche aber EINE Zeile pro Eintrag. Also ist das Schreiben geändert in

Code: Alles auswählen

file = open(fileName,"w")
file.write("{\n")	
for clip in a.keys():
	s = "u'%s' : %s"%( clip, a[clip] )
	if clip != a.keys()[-1]:
		s+=",\n"
	file.write(s)
file.write("\n}\n")
file.close()

Die Datei sieht dann ungefähr so aus:
{
u'a': (2, 4),
u'b': (4, 5)
}

Doch beim Einlesen kommt immer eine Fehlermeldung bei eval(). Und zwar beim ersten Zeichen "{". Was kann ich tun?

Danke für Hilfe

Chris
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo!

Schau dir mal das [mod]pickle[/mod]-Modul an, das scheint mir das zu sein, was du suchst. Noch ein paar Tips:

- Verwende nicht "file" als Name, damit überschreibst du einen built-in-Namen.
- Benutze auf keinen Fall "eval". Wenn du das brauchst, dann machst du mit Sicherheit etwas falsch.
- Ein Blick in PEP8 schadet vielleicht auch nicht.

Bis dann,
Sebastian
Das Leben ist wie ein Tennisball.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Oder json;-)
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Um mal ein wenig auf den Datenstrukturen herumzureiten: Du benutzt ueberhaupt keine Liste sondern ein Dictionary von Tupeln.
`eval` "auf keinen Fall" zu benutzen is etwas hart, aber wenn man das verwenden will, sollte man sich 3mal ueberlegen, ob es nicht doch besser geht.

@Problem: Zum serialisieren hat die Stdlib noch mehr auf Lager: JSON, marshall usw.
lunar

Angesichts der Warnungen in der Dokumentation von marshal ist dessen Empfehlung verwunderlich, wenn man den Einsatz von "eval()" für bedenklich hält. Denn was für "eval()" gilt, trifft auch auf marshal zu:
The marshal module is not intended to be secure against erroneous or maliciously constructed data. Never unmarshal data received from an untrusted or unauthenticated source.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Das war keine Empfehlung, sondern eine Erwaehung der Vollstaendigkeit halber. Aber natuerlich hast du recht.
Antworten