mal wieder ein umlautproblem :)

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
DMD-OL
User
Beiträge: 315
Registriert: Samstag 26. Dezember 2015, 16:21

ich lese eine textdatei aus (die ich so wie sie ist bekomme) und erhalte unter anderem:

Code: Alles auswählen

['T', 'N', '', '', '1', '', 'Schrank', '2', '', 'T\x81r', '']
ich möchte gern haben:

Code: Alles auswählen

['T', 'N', '', '', '1', '', 'Schrank', '2', '', 'Tür', '']
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

@DMD-OL: das ist das selbe. Die Repräsentation von Strings schreibt alle Zeichen außerhalb des Bereichs 0x20-0x7e als Escape-Sequenzen. Du hast also kein Problem, weil solche Ausgaben nur für Debugzwecke gedacht sind.
DMD-OL
User
Beiträge: 315
Registriert: Samstag 26. Dezember 2015, 16:21

ich hab leider nur verstanden, daß i kein problem hab.
alles andere leider nicht. :(
wenn ich es ausgebe, steht da was anderes als Tür.
wie muß ich das denn auslesen, damit Tür ausgegeben wird?
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

@DMD-OL: wie gibst Du das wo aus? Was ist Dein eigentliches Problem, das Du lösen möchtest?
DMD-OL
User
Beiträge: 315
Registriert: Samstag 26. Dezember 2015, 16:21

ich versuche das in eine datenbank zu schreiben, so wie es dort steht (genau so bekomm i es).
ich bekomme aber ein exception:

Code: Alles auswählen

['T', 'N', '', '', '1', '', 'Schrank', '2', '', 'T\x81r', ''] 11
Unexpected error: You must not use 8-bit bytestrings unless you use a text_factory that can interpret 8-bit bytestrings (like text_factory = str). It is highly recommended that you instead just switch your application to Unicode strings.
wie mache ich am besten einen unicode string daraus???

Code: Alles auswählen

a = 'T\x81r'
b = repr(a.decode('unicode-escape'))
print a
print b
immer noch kein ü in T\x81r'

Code: Alles auswählen

Transchlag links
u'T\x81ranschlag links'
DMD-OL
User
Beiträge: 315
Registriert: Samstag 26. Dezember 2015, 16:21

moment, ich muß meinen beitrag von voher korrigierten. das ist etwas mißverständlich:
ich versuche das was ich genau so bekomme:

Code: Alles auswählen

['T', 'N', '', '', '1', '', 'Schrank', '2', '', 'T\x81r', '']
so umzuwandeln, daß in die datenbank ein unicode:
['T', 'N', '', '', '1', '', 'Schrank', '2', '', 'Tür', '']
gespeichert wird.
das umcodieren läuft bei mir aber überhaupt nicht!
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

DMD-OL hat geschrieben:ich versuche das was ich genau so bekomme:

Code: Alles auswählen

['T', 'N', '', '', '1', '', 'Schrank', '2', '', 'T\x81r', '']
so umzuwandeln, daß in die datenbank ein unicode:
['T', 'N', '', '', '1', '', 'Schrank', '2', '', 'Tür', '']
gespeichert wird.
Du willst das so in der Datenbank speichern? Als String mit eckigen Klammern und allem?

Hier vermute ich ja, dass du eher ein konzeptionelles Problem hast.
DMD-OL
User
Beiträge: 315
Registriert: Samstag 26. Dezember 2015, 16:21

nein.
grundsätzlich habe ich folgendes problem:
ich möchte '\x81' als ü augeben lassen, was mir aber nicht gelingt.

Code: Alles auswählen

#!/usr/bin/python
# -*- coding: utf-8 -*-
bezeichnung_1 = '\x81'
result = unicode(bezeichnung_1.decode('unicode-escape'))
print result,type(result)
das speichern in die datenbank kann ich dann allein.
__deets__
User
Beiträge: 14522
Registriert: Mittwoch 14. Oktober 2015, 14:29

Entweder benutzt du decode, oder unicode(bytestring, encoding) - beides ineinander zu verschachteln ist Unfug.

Und du musst schon das richtige Encoding angeben. Bei der \x81 liegt latin1 nahe. Das musst du aber sicherstellen.

Und last but not least der coding-header hat keinen Einfluss auf Dinge, die du irgendwie ueber Dateien oder Datenbankverbindungen oder aehnliches einliest.
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

@DMD-OL: das "\x81" ist kein Unicode-Escape sondern ein Python-String-Escape-Sequenz. "\x81" ist EIN Byte, das kannst Du auch einfach per `len` nachprüfen. Wenn Du Unicodeliterale willst, schreibst Du einfach `u"T\x81r" oder, falls das Encoding in der ersten Zeile der Datei richtig angegeben ist, `u"Tür"`. Wo hast Du nun konkret Probleme, etwas richtig in eine Datenbank zu schreiben?
DMD-OL
User
Beiträge: 315
Registriert: Samstag 26. Dezember 2015, 16:21

ich lese eine textdatei aus, die ich bekomme.
ich erhalte dann richtigerweise nach ein paar codezeilen:

Code: Alles auswählen

bezeichnung = matline[6]
print bezeichnung,type(bezeichnung)
ich bekomme dann die ausgabe:

Code: Alles auswählen

Metallschub verfgt ber <type 'str'>
Schliessgeschwindigkeit der Tr <type 'str'>
das kann ich auch in die datenbank speichern, möchte es aber bevor
ich es in die datenbank sezte, mit umlauten stehen haben.
also so:

Code: Alles auswählen

Metallschub verfügbar über <type 'str'>
Schliessgeschwindigkeit der Tür <type 'str'>
jetzt erst würde ich es in die datenbank schreiben

ach übrigens:

Code: Alles auswählen

#!/usr/bin/python
# -*- coding: utf-8 -*-

result = u"\x81"
print result
ich erhalte als result hier nur:

Code: Alles auswählen

 <type 'unicode'>
wo ist das ü???
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

Das letzte ist nicht der Code, den Du ausgeführt hast. Ich bekomme das hier:

Code: Alles auswählen

>>> result = u"\xfc"
>>> print result
ü
Du machst schon beim Einlesen der Datei (den Teil des Codes, den Du hier nicht zeigst) den Fehler, sie nicht mit dem richtigen Encoding zu lesen. Du willst Unicode-Strings haben, hast aber Bytestrings.
DMD-OL
User
Beiträge: 315
Registriert: Samstag 26. Dezember 2015, 16:21

also sind wir wieder beim anfang?
wie konvertiere ich
result = 'Ofent\x81r'
zu
result = 'Ofentür'
welches encoding gehört denn zu bytestrings?
__deets__
User
Beiträge: 14522
Registriert: Mittwoch 14. Oktober 2015, 14:29

bytestrings *haben* kein Encoding. Das ist praezise der Unterschied zwischen einem bytestring und einem normalen String (bzw. unicode-string, wenn man von Python 2 spricht).

Welches encoding du in deiner Datei verwendest kannst nur du wissen. Wie schon erwaehnt, es sieht nach latin1 aus. Das kannst du also verwenden, zB mit

Code: Alles auswählen

f = open(fname, encoding="latin-1")
(Python 3, codecs Modul in Python 2)

Dann liest Python gleich unicode ein.
DMD-OL
User
Beiträge: 315
Registriert: Samstag 26. Dezember 2015, 16:21

genau das funktioniert eben nicht.
ich bekomme eine solche datei (ausschnitt):

Code: Alles auswählen

T;N;00000522;;1;;Oberschrank;2;;Transchlag links;
T;N;00000522;;3;;bestehend aus:;4;;1 Tr;
T;N;00000522;;5;;1 Glaseinlegeboden;6;;Trd„mpfer passt sich der;
T;N;00000522;;7;;Schliessgeschwindigkeit der Tr;8;;individuell an;
T;N;00000522;;9;; ;10;;H”he:    600 mm;
T;N;00000522;;11;;Breite:  400 mm;12;;Tiefe:   200 mm;
T;N;00000522;;13;;Frontfarbe:  Weiss Hochglanz;14;;Korpusfarbe: Weiss gl„nzend;
T;N;00000522;;15;; ;16;;Fabrikat: VIGOUR;
T;N;00000522;;17;;Modell: cosima Solit„r;18;;Artikel-Nr.: COOSAG040L4;
T;N;00000524;;1;;Oberschrank;2;;Transchlag links;
T;N;00000524;;3;;bestehend aus:;4;;1 Tr;
T;N;00000524;;5;;1 Glaseinlegeboden;6;;Trd„mpfer passt sich der;
T;N;00000524;;7;;Schliessgeschwindigkeit der Tr;8;;individuell an;
T;N;00000524;;9;; ;10;;H”he:    600 mm;
T;N;00000524;;11;;Breite:  400 mm;12;;Tiefe:   200 mm;
T;N;00000524;;13;;Frontfarbe:  Anthrazit Hochglanz;14;;Korpusfarbe: Weiss gl„nzend;
T;N;00000524;;15;; ;16;;Fabrikat: VIGOUR;
T;N;00000524;;17;;Modell: cosima Solit„r;18;;Artikel-Nr.: COOSAG040L6;
ich lese nun mit (hoffentlich richtig in mein programm übertragen):
[codefh = codecs.open(fname, 'rb', 'latin-1')][/code]
die datei aus. nach ausgabe erhalte ich:

Code: Alles auswählen

Oberschrank
bestehend aus:
1 Glaseinlegeboden
Schliessgeschwindigkeit der Tr
 
Breite:  400 mm
Frontfarbe:  Weiss Hochglanz
 
Modell: cosima Solit„r
Oberschrank
bestehend aus:
1 Glaseinlegeboden
Schliessgeschwindigkeit der Tr
 
Breite:  400 mm
Frontfarbe:  Anthrazit Hochglanz
 
Modell: cosima Solit„r
__deets__
User
Beiträge: 14522
Registriert: Mittwoch 14. Oktober 2015, 14:29

Da sind die Umlaute ja auch schon hier kaputt. Kannst du die Datei mit einem Editor aufmachen & die Umlaute sehen? Welches encoding benutzt der Editor dann? Wenn das nicht geht, kannst du die Datei mal bei Pastebin hochladen, damit man sich das mal in echt anschauen kann.
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

@__deets__: das ist nicht "Latin-1" sondern "cp850"-Encoding.
Antworten