KeyError (klíč s diakritikou) – Python – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

KeyError (klíč s diakritikou) – Python – Fórum – Programujte.comKeyError (klíč s diakritikou) – Python – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené — příspěvek s řešením.
Michal
~ Anonymní uživatel
683 příspěvků
23. 1. 2012   #1
-
0
-

Dobrý den,

  Přiznám se, že už jsem se svou chybou bezradný, protože mi nejde do hlavy jak je to možné. Mám slovník, do kterého načtu slova. Pak program projíždí všechny načtené možnosti slov a přiřaruje jim slova ze slovníku. pokud jsou slova bez diakritiky vše funguje, ale když se objeví háčky a čárky, slovník hlásí chybu, že nic nenalezl.

Kód (ve skratce):

#!/usr/bin/env python
# -*- tzdf coding: UTF8

def funkce(self):

  print(self.slovo.vzor)   #vypise capartě
  print("x"+self.slovo.vzor+"x")    #raději jestli kolem slova neni neviditelny "binec"
  p = self.vsechny_vzory["capartě"]   #zde se slovo vyhleda
  if p:
     print("capartě nalezen")  #program úspešně vypise že capartě nalezl (ale to jsem ho tam dodal ručně jako debag)

  ze_slovniku = self.vsechny_vzory[self.slovo.vzor] # zde už program spadne

# self.slovo.vzor je řetězec

# self.vsechny_vzory je slovni {} a capartě tam opravdu je

Výpis programu:

capartě
xcapartěx
capartě nalezen
Exception in Tkinter callback
Traceback (most recent call last):
  File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 1413, in __call__
    return self.func(*args)
  File "./appl.py", line 719, in listbox1dbclick
    self.rozgenerovani()
  File "./appl.py", line 754, in rozgenerovani
    vzor = self.vsechny_vzory.seznam_vzoru[vyhledej]
KeyError: u'capart\u011b'

Díky moc, pokud někdo máte jakékoliv tušení proč se tak děje (kdybych do slovniku uložil caparte a hledal caparte vse funguje)

Michal

Nahlásit jako SPAM
IP: 83.240.77.–
yetty
~ Redaktor
+5
Super člen
23. 1. 2012   #2
-
0
-

Proměnná self.slovo.vzor obsahuje unicode řetězec, zatímco před tím to zkoušíš s obyčejným. Uvedu ukázku, jak to funguje:

# vypise dvakrat to same, ale jenom zdanlive
print "capartě" # obycejny retezec
print u"capartě" # unicode retezec

a = {
	'capartě' : 'ok',
}

b = {
	u'capartě' : 'ok',
}

print a['capartě'] # projde
print a[u'capartě'] # keyerror

print b['capartě'] # keyerror
print b[u'capartě'] # projde

Takže si musíš používání unicode řetězců sjednotit, nejsnazší je asi ho používat i pro klíče ve slovníku.

Nahlásit jako SPAM
IP: 90.183.16.–
Michal
~ Anonymní uživatel
683 příspěvků
23. 1. 2012   #3
-
0
-

#2 yetty

Mnohokrát děkuji, to zní velmi pravděpodobně :-). Něvěděl jsem to a už jsem ti opravdu myslel, že si ze mě Python dělá srandu.

Pracuji v linuxu a příkaz file mi o souborech vypíše následující:

michal@hpg62:~/Dokumenty/Vzory/zadani$ file GUI/slova
GUI/slova: UTF-8 Unicode text
michal@hpg62:~/Dokumenty/Vzory/zadani$ file seznamVzoru.dat
seznamVzoru.dat: UTF-8 Unicode text, with very long lines

Podle seznamVzoru se naplni slovnik, a podle slova se v něm pak vyhledava

Myslel jsem že to znamená to stejne (v posdatě), ale "nedačí" se mi pomoci recode ziskat stejny formát (teda nevím jak, znám jen Latin2..u8)

Díky za pomoc, tohle je doufám poslední s čím budu otravovat

Nahlásit jako SPAM
IP: 83.240.77.–
yetty
~ Redaktor
+5
Super člen
23. 1. 2012   #4
-
0
-

#3 Michal
Soubory se mi zdají být v pořádku, ale asi někde bude váznout jejich načítání. Zkusil bych využít balíček codecs:

import codecs
fileObj = codecs.open("soubor", "r", "utf-8")
u = fileObj.read()

To by ti mělo soubor načíst jako Unicode. 

Jinak tyhle problémy by měl řešit Python 3. Jak moc se mu to povedlo jsem zatím nezkoušel...

Nahlásit jako SPAM
IP: 90.183.16.–
Řešení
K.ork0
Duch
24. 1. 2012   #5
-
0
-
Vyřešeno Nejlepší odpověď

#4 yetty
Ahoj, tady Michal tak jsem si založil (obnovil) účet abych ti mohl poděkovat.

  Nalezl jsem chybu a to jen díky tobě, zachránil si mě, děkuji.

Něnapsal jsem, že využívám knihovnu Tkinter a seznam vzorů mám uložen v komponentě listbox. Popravdě by mě nenapadlo, že vestavěná knihovna bude působit chybu v programu :-) Listbox si data asi reprezentuje nějak jinak, protože přez něj jsem ve slovníku nic nenašel. když jsem vytvořil kopii seznamu kopie_seznamu = [] a plnil obě věci zaráz, pak při kliknucí pracoval jen s pozicí a vyhledával podle kopie vše fungovalo

př: chyby

    pom = listbox1.curselection()
    vzor = pom[1]  # zde se naházel řetězec vzor   

   vysledek = slovnik[vzor] # chyba nenalezne

spravne:

    pom = self.listbox1.curselection()
    pom = int(pom[0]) #pom[0] obsahuje řetezec s číslem položky
    vzor = kopie_vzoru[pom] #pom je index vabraného -> kopie_vzoru má na stejném místě vzor ve správném kódování :-) a prak vše funguje

Bez tebe bych, nevěděl kde hledat a tak mnohokrát děkuji

Nahlásit jako SPAM
IP: 83.240.77.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 8 hostů

Podobná vlákna

Povinný unikátní klíč — založil Forest

Klíč na MylSAM a InnoDB — založil Davidkopecky

Navrh DB ve 3NF - slozeny klic — založil HellMaster

Cidzi klic pro vice tabulek — založil JannyM

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý