Seite 1 von 1

mal wieder ein umlautproblem :)

Verfasst: Samstag 18. November 2017, 17:50
von DMD-OL
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', '']

Re: mal wieder ein umlautproblem :)

Verfasst: Samstag 18. November 2017, 17:53
von Sirius3
@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.

Re: mal wieder ein umlautproblem :)

Verfasst: Montag 20. November 2017, 12:33
von DMD-OL
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?

Re: mal wieder ein umlautproblem :)

Verfasst: Montag 20. November 2017, 13:28
von Sirius3
@DMD-OL: wie gibst Du das wo aus? Was ist Dein eigentliches Problem, das Du lösen möchtest?

Re: mal wieder ein umlautproblem :)

Verfasst: Montag 20. November 2017, 14:57
von DMD-OL
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'

Re: mal wieder ein umlautproblem :)

Verfasst: Montag 20. November 2017, 16:09
von DMD-OL
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!

Re: mal wieder ein umlautproblem :)

Verfasst: Montag 20. November 2017, 16:48
von /me
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.

Re: mal wieder ein umlautproblem :)

Verfasst: Montag 20. November 2017, 18:09
von DMD-OL
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.

Re: mal wieder ein umlautproblem :)

Verfasst: Montag 20. November 2017, 18:37
von __deets__
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.

Re: mal wieder ein umlautproblem :)

Verfasst: Montag 20. November 2017, 20:02
von Sirius3
@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?

Re: mal wieder ein umlautproblem :)

Verfasst: Dienstag 21. November 2017, 14:02
von DMD-OL
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 ü???

Re: mal wieder ein umlautproblem :)

Verfasst: Dienstag 21. November 2017, 14:17
von Sirius3
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.

Re: mal wieder ein umlautproblem :)

Verfasst: Dienstag 21. November 2017, 14:36
von DMD-OL
also sind wir wieder beim anfang?
wie konvertiere ich
result = 'Ofent\x81r'
zu
result = 'Ofentür'
welches encoding gehört denn zu bytestrings?

Re: mal wieder ein umlautproblem :)

Verfasst: Dienstag 21. November 2017, 14:40
von __deets__
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.

Re: mal wieder ein umlautproblem :)

Verfasst: Dienstag 21. November 2017, 16:08
von DMD-OL
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

Re: mal wieder ein umlautproblem :)

Verfasst: Dienstag 21. November 2017, 16:10
von __deets__
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.

Re: mal wieder ein umlautproblem :)

Verfasst: Dienstag 21. November 2017, 16:46
von Sirius3
@__deets__: das ist nicht "Latin-1" sondern "cp850"-Encoding.