Python och MySQL - Problem med teckenkodning [LÖST]

Här diskuteras programmering och utveckling
sorenux
Inlägg: 23
Blev medlem: 03 okt 2007, 20:14
OS: Ubuntu
Utgåva: 14.04 Trusty Tahr LTS
Ort: Skärplinge(Norduppland)

Python och MySQL - Problem med teckenkodning [LÖST]

Inlägg 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
Användarvisningsbild
DrMegahertz
Inlägg: 296
Blev medlem: 06 maj 2006, 14:37
OS: Ubuntu
Utgåva: 14.04 Trusty Tahr LTS
Ort: Södra Dalarna

Re: Python+mysql

Inlägg 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'].
BildAre you shpongled? Bild
sorenux
Inlägg: 23
Blev medlem: 03 okt 2007, 20:14
OS: Ubuntu
Utgåva: 14.04 Trusty Tahr LTS
Ort: Skärplinge(Norduppland)

Re: Python+mysql

Inlägg 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 ???
Lars
Inlägg: 6191
Blev medlem: 14 jan 2007, 19:31
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Ort: Stockholm

Re: Python+mysql

Inlägg 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).
sorenux
Inlägg: 23
Blev medlem: 03 okt 2007, 20:14
OS: Ubuntu
Utgåva: 14.04 Trusty Tahr LTS
Ort: Skärplinge(Norduppland)

Re: Python+mysql

Inlägg 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 ;D
Lars
Inlägg: 6191
Blev medlem: 14 jan 2007, 19:31
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Ort: Stockholm

Re: Python+mysql

Inlägg 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.
sorenux
Inlägg: 23
Blev medlem: 03 okt 2007, 20:14
OS: Ubuntu
Utgåva: 14.04 Trusty Tahr LTS
Ort: Skärplinge(Norduppland)

Re: Python+mysql

Inlägg 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 ;D
Skriv svar

Återgå till "Programmering och webbdesign"