Dobrý ještěr. Narazil jsem na problém, který neumím vyřešit: Momentálně pracuji na jakémsi úkolníčku, jehož jednou ze základních featur je načítání a ukládání seznamu úkolů z/do souboru. Přišlo mi jako zbytečně megalomanské řešení používat nějaký databázový modul a rozhodl jsem se tedy ukládat seznam do textového souboru pomocí file() a write(), přičemž na každé řádce v souboru mám uloženo 10 proměnných (důležitost, předmět úkolu, hodina, den, měsíc atd.) navzájem oddělených znakem $ (to možná ještě změním kupříkladu na <$> pro případ, že bych potřeboval $ do úkolu zadat, i když to není příliš pravděpodobné).
Načítání i ukládání funguje bez problémů, ovšem jen pokud v popisu úkolu (jediný text v "databázi", vše ostatní jsou číselné hodnoty) nepoužívám interpunkci. Kódování mám nastaveno správně - v úvodu souboru i ve vlastnostech mám cp1250, čárky i háčky se ve výpise úkolů normálně zobrazují a problém nastává až ve chvíli, kdy se pokusím řetězec s interpunkcí zapsat do souboru. Dodatek: V průběhu psaní příspěvku jsem zkusmo změnil kódování na utf-8 a výylsedek je úplně stejný.
Cesta řetězce je následující: Jako grafické prostředí používám Tkinter, tedy napíši text s háčkami a čárkami do udělátka Text, odkud se pomocí funkce get() uloží jako string do seznamu, odkud se zapisuje do souboru. Zkoušel jsem řetězec před zápisem do souboru zkonvertovat pomocí unicode(), ovšem výsledek je stejný.
Error je následující:
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-2: ordinal not in range(128)
přičemž error je vyhozen samozřejmě u řádky, kde se obsah řetězce zapisuje do souboru a obsah řetězce byl "ččč"
Důležité části kódu zde:
#část funkce pro zápis do seznamu
predmet2 = predmet.get(1.0, END)
predmet3 = predmet2[0:len(predmet2)-1]
ukoly.append([0, dulezitost.get(), predmet3, [hodiny2, minuty2], [rok.get(), mesic2, den2], str(alert), str(cas)])
#Funkce, která zapíše seznam do souboru
def zapis_do_souboru():
global ukoly
if os.path.exists("databaze.txt"):
os.remove("databaze.txt")
soubor = file("databaze.txt", "w")
for n in ukoly:
soubor.write(str(n[0]))
soubor.write("$")
soubor.write(str(n[1]))
soubor.write("$")
soubor.write(unicode(n[2])) #TOTO je onen osudný řetězec (teď je tu unicode(), ale zkoušel jsem i str() a nic)
soubor.write("$")
soubor.write(str(n[3][0]))
soubor.write("$")
soubor.write(str(n[3][1]))
soubor.write("$")
soubor.write(str(n[4][0]))
soubor.write("$")
soubor.write(str(n[4][1]))
soubor.write("$")
soubor.write(str(n[4][2]))
soubor.write("$")
soubor.write(str(n[5]))
soubor.write("$")
soubor.write(str(n[6]))
soubor.write('\n')
soubor.close()
#funkce pro načtení seznamu ze souboru, osudný řetězec je opět [2]
def precti_ze_souboru():
global ukoly
databaze = open("databaze.txt")
ukoly2=[]
for line in databaze:
line2 = line.replace("\n", "").split("$")
line3 = [line2[0], line2[1], line2[2], [line2[3], line2[4]], [line2[5], line2[6], line2[7]], line2[8], line2[9]]
ukoly2.append(line3)
ukoly = ukoly2
#pro jistotu ještě udělátko Text, pomocí kterého se do seznamu zapisuje onen řetězec
predmet = Text(pridat, padx=5, width=60, height=5)
predmet.grid(row=1, column=3, sticky=NW)
Předem děkuji za pomoc.