Objekt Attribut in Datei speichern

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
kruphi
User
Beiträge: 21
Registriert: Donnerstag 25. Juli 2013, 14:57

Guten Tag,

ich habe mal wieder ein Problem. Ich habe ein Objekt angelegt und die Attribute werden auch Ordnungsgemäß befüllt.
Auch ein abruf mit der print Funktion funktioniert einwandfrei.
Jetzt muss ich diese Daten in eine Datei schreiben. Das funktioniert bereits mit dem Großteil der Objekten fehlerfrei.
Bei einem Attribut habe ich allerdings noch Probleme.

Eigentlich sollten an dieser Stelle Mailadressen stehen, leider ist dieser Teil eine Sammlung verschiedener Einträge.
Als Beispiel stehen dort Dinge wie:
Karl Mobil: 1234567
0
0
Fritz Franzen: 3224234234
Karlchen@mail.de

mit einer einfachen print Anweisung können alle Inhalte ausgegeben werden

Code: Alles auswählen

for person in personen:
    print personen[person].mail
sobald ich diesen Inhalt in eine Datei schreibe, bekomme ich einige Fehler. Da ich selbst schon versucht habe dieses Problem zu lösen. Werde ich an dieser Stelle mal meine " Lösungsversuche" hier mit Fehlermeldung online Stellen.


Versuch 1:

Code: Alles auswählen


for person in allePersonen:
	fobj = open(("datei.txt"), "w") 
	fobj.write(allePersonen[person].mail)
	fobj.close()	

Die Fehlermeldung dabei lautet TypeError: expected a character buffer object

also habe ich versucht dieses in einen String zu bringen.

Code: Alles auswählen

for person in allePersonen:
	fobj = open(("datei.txt"), "w") 
	fobj.write(str(allePersonen[person].mail))
	fobj.close()
Dabei kam folgende Fehlermeldung UnicodeEncodeError: 'ascii' codec can't encode character u'\xfc' in position 1:
ordinal not in range(128)

Also dachte ich mir wieder eine encode Geschichte (Da hatte ich euch schon vor ein paar Tagen mit belästigt) .

Code: Alles auswählen

for person in allePersonen:
	fobj = open(("datei.txt"), "w") 
	fobj.write(str(allePersonen[person].mail).encode("utf-8"))
	fobj.close()
Jetzt habe ich das versucht mit try abzufangen

Code: Alles auswählen

def mail(mail):
	try:
		return str(mail)
	except:
		return None
Auch kein Erfolg. Ihr könnt mir jetzt ja mal einen Tip geben warum das nicht funktioniert. Ich da ich - wie man sicherlich sieht- noch ein blutiger Anfänger bin, sagt mir bitte ganz deutlich was ich verkehrt gemacht habe und wo meine Lösungsansätze mist sind! Ich bedanke mich auch jetzt schon im Vorfeld für gut gemeinte Kritik!

Danke! Kruphi
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Hallo kruphi,

Du machst die Konvertierung von unicode nach str ja schon mit dem "str" bevor Du überhaupt .encode aufrufst. Welchen Typ hat denn das "mail"-Attribut?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Hallo,

- Dateien sollte man immer mittels ``with open(...) as fileobj`` öffnen; damit stellt man sicher, dass diese immer geschlossen wird.

- Du überschreibst alle Deine Daten, da Du *in* der Schleife die Datei öffnest.

- Es gibt wunderbare "fertige" Formate wie JSON, CSV, XML usw. für die es in Python auch wunderbare Libs gibt, die diese sowohl lesen als auch speichern können. Das nur als Vorschlag, falls Du nicht zwingend alles selber machen willst.

- arbeitest Du intern mit Unicode-Strings? Wenn nein, welches Encoding hat denn der String?
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
kruphi
User
Beiträge: 21
Registriert: Donnerstag 25. Juli 2013, 14:57

Ich danke euch erstmal für die schnelle Antwort!!
Als Ergänzung, dieses Problem ist ein Auszug aus einem Projekt.
Dabei lese ich Daten aus einer XML ein und muss verarbeiten und wieder speichern.

@Sirius3
Macht es sin erst die Datei erst mit encode aufzurufen? Kann ich Sie damit direkt in ein String wandeln?
I

@Hyperion Danke für den Hinweis mit dem with, das war mir gar nicht so klar!
Das mit dem überschreiben habe ich gerade gesehen. Habe diesen Fehler bereits korrigiert.
Ich versuche alles eigentlich in UTF-8 zu speichern und zu öffnen. Da ich mir da aber nicht so sicher bin, wie überprüfe ich das ?
BlackJack

@kruphi: Eine Datei mit encode aufrufen? Das macht keinen Sinn. Und was ist für Dich jetzt ein String? Wenn Du mit XML arbeitest wirst Du von den meisten Bibliotheken `unicode`-Objekte bekommen, zumindest für Zeichenketten die etwas ausserhalb von ASCII enthalten. Wenn Du das als UTF-8 kodiert in einer Textdatei speichern möchtest musst Du *selber* und *explizit* die Unicodezeichenketten nach UTF-8 kodieren. `io.open()` bietet sich da an, dann werden die Unicode-Zeichenketten mit der bei dem Aufruf angegebenen Kodierung gespeichert.

Beim parsen des XML muss man keine Kodierung angeben, weil die vom Parser entweder implizit angenommen oder aus der XML-Datei selber ermittelt wird.
kruphi
User
Beiträge: 21
Registriert: Donnerstag 25. Juli 2013, 14:57

@BlackJack
Korrigiere mich falsch ich mich falsch ausdrücke... aber nur für mein Verständnis und aus diesem Grund für jede Korrektur dankbar!
- encode ist eine Funktion mit der ich Zeichenketten in einem bestimmten Format formatieren kann
- ein String ist eine Zeichenkette, wie diese codiert ist/sind habe ich mir noch keine Gedanken gemacht
ich werde mir mal io.open anschauen.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

kruphi hat geschrieben: - encode ist eine Funktion mit der ich Zeichenketten in einem bestimmten Format formatieren kann
Nein - zumindest sind "Format" und "formatieren" (und Funktion streng genommen auch - "Methode" ist hier präziser) nicht wirklich passend. ``encode`` erzeugt einen neuen String, welcher ein Byte-String mit einem bestimmten Encoding ist, sprich einer *speziellen* Repräsentation von Zeichen in Bytes. Solche Encodings gibt es viele verschiedene und ASCII, UTF-8, ISO-8859-* usw sind Beispiele dafür. Idealer Weise sollte der Ursprungsstring ein Unicode-String sein.

Das Gegenteil davon macht ``str.decode``, welches von einen codierten Byte-String einen Unicode-String erzeugt.
kruphi hat geschrieben: - ein String ist eine Zeichenkette, wie diese codiert ist/sind habe ich mir noch keine Gedanken gemacht
Das solltest Du aber - das Wissen über Codierungen sind für das Arbeiten damit essenziell. Schau mal die Links in meiner Signatur an. Da findest Du ziemlich alles, was man zum Verstehen braucht :-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
kruphi
User
Beiträge: 21
Registriert: Donnerstag 25. Juli 2013, 14:57

Ich bedanke mich an dieser Stelle das ihr etwas Lich in mein Unwissen gebracht habt!
Ich werde mich mal etwas näher mit dem Coding beschäftigen.

Vielen dank für eure Mühe!
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

@kruphi: Wenn ich mal wieder an dem Punkt bin, an dem ich mich im coding-Jungle verheddert hab', ruf' ich mir wieder ins Gedächtnis, dass unicode kein encoding im Sinne von UTF8 oder einem ISO oder ASCII ist. Diese gedankliche Trennlinie hilft mir sehr, jedem Ding wieder seine richtige Seite zu geben... :)

mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Antworten