Unicode bzw. Codecs

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
Cline84
User
Beiträge: 3
Registriert: Montag 29. Juni 2015, 13:04

Hallo,

nach dem durchforsten von Literatur, Internet und des Forums habe ich leider keine passende Lösung gefunden, die mein Problem löst.

Ich schreibe eine Hausarbeit für die automatische Sprachverarbeitung im polnischen. Dafür benutze ich ein Modul namens Morfeusz. Dieses Modul stemmt Wörter und analysiert sie auf ihre Stämme. Damit habe ich jedoch nichts zu tun. Das macht seinen Job von alleine.
Mein Code ist auch sehr einfach/primitiv geschrieben denke ich, jedoch macht es was es soll :wink:

Mein Problem ist nun folgendes: Ich habe mit Tkinter eine Oberfläche geschaffen, in der nach Eingabe in ein Textfeld die Lösung in ein Mehrzeiliges Textfeld überträgt. Soweit so gut. Jedoch sieht das immer so aus: u'mie\u107:v2 ist also noch codiert.

der Befehl:

Code: Alles auswählen

codecs.open('filename', encoding='utf8').read()
ist mir geläufig.
Aber soweit ich aus der Literatur entnehmen kann erfolgt die richtige Ausschreibung erst mit dem Print Befehl. Ich habe jedoch keinen, da ich das Ergebnis mit

Code: Alles auswählen

Ergebnisfeld.insert("end", str(ergebnis))
in die Box eintragen lassen möchte.
Ich habe auch schon verschiedene Methoden mit

Code: Alles auswählen

Ergebnisfeld.insert("end", str(u'ergebnis'))
mit verschiedenen Klammern und ähnliches Probiert, komme jedoch leider nie zum gewollten Ergebnis.
Mit

Code: Alles auswählen

codecs.encode(obj[, encoding[, errors]])
kam ich leider auch nicht weiter, jedoch glaube ich das lag nur am Syntax??!! :K

Kann mir irgendwer einen Denkanstoß geben??

Vielen Dank schon mal im Voraus!!!!

Hier noch ein paar Infos:
Python 2.7
System Ubuntu 14.04 LTS

Code: Alles auswählen

import codecs
from morfeusz import *
from Tkinter import *
from tkFileDialog   import askopenfilename

#==============================================================================
# #Hauptfenster         
#==============================================================================
main = Tk()
main.title('Automatische Sprachverarbeitung')

#==============================================================================
#Unterprogram leitet Morfeusz-Analyse ein
#==============================================================================
def send1():
    s = Eingabefeld1.get()
    for x in analyse(s):
     ergebnis = x
    Ergebnisfeld.insert("end", str(ergebnis))
     
def send2():
    s = Eingabefeld2.get()
    d = codecs.open(s, encoding='utf8').read()
    for x in analyse(d):
     ergebnis = x
    Ergebnisfeld.insert("end", str(ergebnis))

def browse():
   file_path = askopenfilename(filetypes=[("Text File",'.txt')])
   Eingabefeld2.insert("end", str(file_path))
   
def clear():
   Eingabefeld1.delete(0, END)
#==============================================================================
# #Definition der einzelnen Frame Abschnitte
#==============================================================================

Frame = Label(main).grid(row=0, column=0, rowspan=3, columnspan=3)

#==============================================================================
# #Eingabe- und Textfelder und deren Zuordnung
#==============================================================================
Text1 = Label(main,text='Text Eingabe:',width=15, anchor="w").grid(row=0, column=0, padx=10)
Text2 = Label(main,text='Datei:', width=15, anchor="w").grid(row=1, column=0, padx=10)
Text3 = Label(main,text='Resultat:', width=15, anchor="w").grid(row=2, column=0, padx=10)

Eingabefeld1 = Entry(main)
Eingabefeld1.grid(row=0, column=1, sticky="nsew", padx=5, pady=5)

Eingabefeld2 = Entry(main)
Eingabefeld2.grid(row=1, column=1, sticky="nsew", padx=5, pady=5)

Ergebnisfeld = Text(main)
Ergebnisfeld.grid(row=2, column=1, sticky="nsew", padx=5, pady=5)

Knopf0 = Button(main,text='Clear',anchor="e", command=clear).grid(row=0, column=2, padx=5, pady=5)
Knopf1 = Button(main,text='Analyse',anchor="e", command=send1).grid(row=0, column=3, padx=5, pady=5)
Knopf2 = Button(main,text='Analyse',anchor="e", command=send2).grid(row=1, column=3, padx=5, pady=5)
Knopf3 = Button(main,text='Browse',anchor="e", command=browse).grid(row=1, column=2, padx=5, pady=5)
Knopf4 = Button(main,text='Ende', anchor="s", command=main.destroy).grid(row=3, column=1, padx=5, pady=10)
#==============================================================================
# Schleifen ende
#==============================================================================
main.mainloop()
BlackJack

@Cline84: Das kann so eigentlich nicht sein es sei denn Deine Ausgangsdaten sind schon nicht in Ordnung oder `analyse()` (wo kommt das überhaupt her?) macht Mist.

Wenn Du einfach nur die Datei mit `codecs.open()` öffnest, dann liest Du ein `unicode`-Objekt ein. Wenn Du das vor der Anzeige mit `str()` in eine Bytezeichenkette kodierst (warum eigentlich?) dann können zwei Dinge passieren: Die Daten enthalten nichts ausserhalb von ASCII, dann werden sie korrekt angezeigt, oder sie enthalten Zeichen ausserhalb von ASCII, dann wird gar nichts angezeigt weil der Versuch das ohne Kodierungsangabe in eine Bytezeichenkette zu wandeln zu einer Ausnahme führen wird.
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

@Cline84: Ein \u107 kann nicht vorkommen, weil das ein fehlerhaft kodierter Codepoint ist, die bestehen nämlich immer aus 4 Ziffern. Wenn Du tatsächlich ein u' davor stehen hast, hast Du irgendwann einmal den Unicode-String in seine Python-Repräsentation umgewandelt. Laß auf jeden Fall mal alle str() weg. Die sorgen nämlich, wenn Du wirklich Unicode-Zeichen hast, nur dafür, dass Fehlermeldungen produziert werden.
Cline84
User
Beiträge: 3
Registriert: Montag 29. Juni 2015, 13:04

Das kann so eigentlich nicht sein es sei denn Deine Ausgangsdaten sind schon nicht in Ordnung oder `analyse()` (wo kommt das überhaupt her?) macht Mist.
@BlackJack Das das Program bei euch nicht funktioniert wundert mich nicht, da ihr das Morfeusz Modul nicht habt (daher auch analyse() ) .


@Sirius3 Ohne str() kommt das selbe Ergebnis und wie man hoffentlich auf dem Bild sieht kommt da die u0107 :K
https://www.dropbox.com/s/qkms3rkxfj31r ... 3.jpg?dl=0
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

@Cline84: jetzt ist alles klar. Du versuchst eine Liste mit einem dreielementigen Tupple einem Textfeld zuzuweisen. TkInter wandelt das automatisch in einen String um. Du mußt schon wissen, welchen Datentyp das analyse zurückliefert und welche(n) Wert(e) Du dargestellt haben willst.
Cline84
User
Beiträge: 3
Registriert: Montag 29. Juni 2015, 13:04

@Sirius3 Öhm, welcher Datentyp das ist weiß ich gar nicht! Was ich möchte ist, dass der Text in korrekter polnischer Schreibweise ausgegeben wird. Mehr kann ich da jetzt auch nicht zu sagen. Für mich war das Programm schon ein Kraftakt, auf den ich sehr stolz bin alleine so hinbekommen zu haben. :oops:

Selbst der def send2 (): gibt trotz des codecs.open Befehls das Ergebnis so wie im Foto aus.
BlackJack

@Cline84: Den Datentyp von Deinen Werten musst Du aber wissen, denn der bestimmt ja was man damit alles machen kann und welches Ergebnis die einzelnen Operationen jeweils haben. Und wenn Dir die Standarddarstellung eines Objektes nicht gefällt dann musst Du halt entsprechenden Code schreiben der Dir eine Darstellung liefert die Du haben möchtest.
Antworten