Zápis do souboru s interpunkcí – Python – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Zápis do souboru s interpunkcí – Python – Fórum – Programujte.comZápis do souboru s interpunkcí – Python – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
Vozka
~ Anonymní uživatel
3 příspěvky
30. 3. 2008   #1
-
0
-

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.

Nahlásit jako SPAM
IP: 77.237.140.–
Reklama
Reklama
pawlik0
Grafoman
30. 3. 2008   #2
-
0
-
Nahlásit jako SPAM
IP: 89.176.203.–
Sa Nata A Na. Howgh
Blujacker
~ Moderátor
0
Grafoman
30. 3. 2008   #3
-
0
-

pawlik napsal:
S tímhle ti já moc nepomůžu, sám s češtinou mívám také velké problémy. Prozkoumej fce unicode(), encode() a decode() viz http://www.py.cz/PythonUnicodeCestina


Jj:) vždycky to zapomenu
To Vozka :
Musíš použít, jak už pawlik řekl, buď funkci decode, nebo encode (nevím, vyzkoušej)...



>>> r="ěěě"
>>> type(r)
<type 'str'>
>>> r=r.decode("cp1250")
>>> type(r)
<type 'unicode'>
>>> print r
ěěě
>>> r=r.encode("cp1250")
>>> type(r)
<type 'str'>
>>> print r
ěěě
>>>

Jak vidíš, funkcí decode uděláš z řetězce unicode a funkcí encode z toho zase bude <str>

Nahlásit jako SPAM
IP: 213.220.226.–
Navštivte server Matematika pro každého
Najdete zde články zabývající se matematikou základních a středních škol a databázi hlavolamů.
Pro vyzkoušení Vaš
Vozka
~ Anonymní uživatel
3 příspěvky
30. 3. 2008   #4
-
0
-

Aha, na PyCZ jsem se koukal, ale tohle jsem úplně přehlédl. V příkladech je přesně můj případ, stačí pomocí encode převést string z unicode třeba utf-8:

# -*- coding: utf-8 -*-


text=u"Žluťoučký kůň pěl ďábelské ódy."

f=open("Kun.txt","w")
f.write(text) # způsobí error
f.write(text.encode("utf8")) # ok
f.close()


Vše funguje, děkuji za pomoc :) (navíc velmi rychlou)

Nahlásit jako SPAM
IP: 77.237.140.–
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, 50 hostů

Podobná vlákna

Zapis do souboru — založil Ondřej Karanský

Zapis do souboru — založil Kvetinar

Zápis do souboru — založil Milhaus92

 

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