Sida 1 av 1
Python och MySQL - Problem med teckenkodning [LÖST]
Postat: 08 mar 2008, 13:42
av sorenux
Håller på att lära mig python. Jag har ett script/program som hämtar uppgifter från en databas och skriver ut posterna men jag får inte upp de svenska tecknen rätt.
Kod: Markera allt
#!/usr/bin/python
#__*__ coding: ISO-8859-1 __*__
import MySQLdb
database=MySQLdb.connect(db='firma_db',user='xxx',passwd='xxxxxx')
c = database.cursor()
c.execute('SELECT * FROM kunder')
for row in c.fetchall():
print row
där å,ä,ö skallvara får jag typ :\xe5,\xe4,\xf6
Hur får jag python att skriva "rätt" tecken
Re: Python+mysql
Postat: 08 mar 2008, 13:55
av DrMegahertz
Har lite dåligt med tid, men kika på detta;
Kod: Markera allt
>>> a = "åäö"
>>> a
'\xc3\xa5\xc3\xa4\xc3\xb6'
>>> print a
"åäö"
Den första utmatningen visar hur strängen lagras i minnet, medan den andra utmatningen faktiskt visar datan med rätt kodning och allt.
Jag skulle tro att 'row' är ett dictionary, så prova med; >>> print row['fältnamn'].
Re: Python+mysql
Postat: 08 mar 2008, 14:25
av sorenux
(fetchall) är en metod som returnerar en lista där varje rad är en tuplett. row är alltså inte en dict. så drMegahertz om jag förstod dig rätt så fungerar inte din metod

Re: Python+mysql
Postat: 08 mar 2008, 14:49
av Lars
Det är ju minst 3 olika teckentabeller inblandade här: den som används i py-filen, den som används i databasen och den som används i terminalen. De två första är konstanta, den sista kan ändras beroende på hur programmet körs

Men observera att kodningen av py-filen bara påverkar strängar som finns i filen, t.ex. om man skriver "a = 'räksmörgås'".
Om omvandlingen inte sker automatiskt så kanske du måste skriva "print row[0].decode('iso-8859-1')" eller liknande. Funktionen decode() omvandlar från angiven teckentabell till den som används i locale (aktuell terminal).
Re: Python+mysql
Postat: 08 mar 2008, 18:05
av sorenux
Hej Lars ! provat det du föreslog men om jag gör "bokstavligen" som du föreslog får jag AttributError alltså "row.decode(xxx)" gör att decode blir ett argument till row, vilket inte fungerar. I connect funktionen skall man kunna göra ändringar av charset men inget jag lyckats med. som jag antydde innan så är jag bara en nybörjare och just nu börjar jag bli trött. Om jag hämtar uppgifterna från db via sql-satser så får jag "rätt" tecken. Kanske borde jag helt övergå till engelska

Re: Python+mysql
Postat: 08 mar 2008, 18:34
av Lars
Men du gjorde inte bokstavlingen som jag gjorde

Funktionen decode() fungerar alltså bara på strängar, det var därför jag skrev row[0].decode, vilket borde fungera om det ligger strängar i första kolumnen.
Jo, något smart argument till connect() är förmodligen Rätt™ sätt att göra det på, jag vet inte exakt hur det där fungerar. Det gäller ju att vara konsekvent också så att man både läser och skriver med samma teckenkodning. Rätt argument till connect() borde fixa det där kan man tycka. Det finns ett exempel på
http://www.uptill3.com/2008/01/15/pytho ... b-snippet/ som använder UTF-8.
Re: Python+mysql
Postat: 09 mar 2008, 21:30
av sorenux
Tack Lars för dina svar, jag gjorde faktiskt bokstavligt som du skrev, men jag lyckades slarva bort [0] i min kommentar. Hur som helst av någon anledning så fick jag det inte att fungera med argumentet "iso-8859-1" i decode(), men efter en stunds prövningar så komjag fram till (utf-8) då fungerade det perfekt
