[python] Strings met tekens als ë in bestand opslaan.

Pagina: 1
Acties:
  • 362 views sinds 30-01-2008
  • Reageer

  • cyberstalker
  • Registratie: September 2005
  • Niet online

cyberstalker

Eersteklas beunhaas

Topicstarter
Ik probeer een string met daarin het teken ë op te slaan.

Hier krijg ik van python een fout:
UnicodeDecodeError: 'ascii' codec can't decode byte 0xeb in position 25: ordinal not in range(128)
Ik heb al op google gezocht en de unicode functie geprobeerd, maar zonder veel succes. Hoe kan ik dit oplossen?

voorbeeld:
Python:
1
2
3
4
5
6
7
8
9
name='hoëi'
name.encode()
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
UnicodeDecodeError: 'ascii' codec can't decode byte 0xeb in position 2: ordinal not in range(128)
>>> name.encode('utf8')
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
UnicodeDecodeError: 'ascii' codec can't decode byte 0xeb in position 2: ordinal not in range(128)


edit: het betreft python 2.4.3

[ Voor 40% gewijzigd door cyberstalker op 06-03-2007 16:49 ]

Ik ontken het bestaan van IE.


  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 10:26

TeeDee

CQB 241

En als je een "u" voor je string toewijzing zet en evt. een encode('utf-8')?
Python:
1
name=u'hoëi'.encode('utf-8')

mijn kennis van python is erg gelimiteerd, maar zoiets zag ik een keer voorbijvliegen in een stuk code van een collega, vandaar.

[ Voor 36% gewijzigd door TeeDee op 06-03-2007 17:03 ]

Heart..pumps blood.Has nothing to do with emotion! Bored


  • cyberstalker
  • Registratie: September 2005
  • Niet online

cyberstalker

Eersteklas beunhaas

Topicstarter
TeeDee schreef op dinsdag 06 maart 2007 @ 17:02:
En als je een "u" voor je string toewijzing zet en evt. een encode('utf-8')?
Python:
1
name=u'hoëi'.encode('utf-8')

mijn kennis van python is erg gelimiteerd, maar zoiets zag ik een keer voorbijvliegen in een stuk code van een collega, vandaar.
Als ik iets als
Python:
1
2
>>> unicode(name, 'latin-1').encode('utf-8')
'ho\xc3\xabi'
doe, krijg ik in mijn scherm wel het juiste resultaat.

Probeer ik dit echter in mijn script te verwerken, dan gaat het nog steeds fout.

Python:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#!/usr/bin/python

import re
import urllib
import xml.dom.minidom
from xml.dom.minidom import Node

mapskey='mijn google maps key'
filename='inputfile, in csv'
filename_out='outfile, in sql'
regex_addr=re.compile(' \d')

file=open(filename, 'r')
file_out=open(filename_out, 'w')

file_out.write("INSERT INTO shop (name, street, number, zip_numeric, zip_alpha, city, longitude, latitude) VALUES\n")

for line in file:
    fields=line.split('","')
    name=fields[6]
    name=unicode(name, 'latin-1').encode('utf-8')
    address=fields[7]
    zipcode=fields[10]
    
    # some fields contain multiple fields themselves
    
    # address
    addr_fields=regex_addr.split(address)
    street=addr_fields[0]
    number=address[len(street)+1:]
    
    # zipcode
    zip_alpha=zipcode[4:]
    zip_numeric=zipcode[:4]
    
    # connect to google to retrieve city and geolocation
    url='http://maps.google.com/maps/geo?q='+urllib.quote(street)+'%20'+urllib.quote(number)+'%20'+zipcode+'%20The%20Netherlands&output=xml&key='+mapskey
    googlexml=urllib.urlopen(url)
    
    doc=xml.dom.minidom.parse(googlexml)
    return_code=doc.getElementsByTagName('code')[0].firstChild.data
    
    if return_code == '200':
        city=doc.getElementsByTagName('DependentLocalityName')[0].firstChild.data
        coordinates=doc.getElementsByTagName('coordinates')[0].firstChild.data
    
        # split coordinates in longitude and latitude
        coord_fields=coordinates.split(',')
        longitude=coord_fields[0]
        latitude=coord_fields[1]
    else:
        city='Onbekend'
        longitude='0'
        latitude='0'
    
    googlexml.close()
    
    # add data to file_out
    file_out.write("('"+name+"', '"+street+"', '"+number+"', '"+zip_numeric+"', '"+zip_alpha+"', '"+city+"', '"+longitude+"', '"+latitude+"'),\n")
    
    # print data, just for fun, and to see how fast it goes ;)
    print name, street, number, zip_numeric, zip_alpha, city, longitude, latitude

file_out.close()
file.close()


Dit geeft een aantal regels weer, en gaat vervolgens fout op aparte tekens.
Traceback (most recent call last):
File "./convert.py", line 59, in ?
file_out.write("('"+name+"', '"+street+"', '"+number+"', '"+zip_numeric+"', '"+zip_alpha+"', '"+city+"', '"+longitude+"', '"+latitude+"'),\n")
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 25: ordinal not in range(128)

Ik ontken het bestaan van IE.


  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 10:26

TeeDee

CQB 241

Bij het aanmaken van het file zorg je er ook voor dat het Unicode is?

Heart..pumps blood.Has nothing to do with emotion! Bored


  • PommeFritz
  • Registratie: Augustus 2001
  • Laatst online: 24-11 22:10

PommeFritz

...geen friet

Python 2.5 op windows XP:
code:
1
2
3
4
5
6
>>> open("foo.txt","w").write("mëëh")
>>> open("foo.txt").read()
'm\x89\x89h'
>>> print open("foo.txt").read()
mëëh
>>>


Als je het echter goed wilt doen, dan regel je je encodings netjes en maak je gebruik van unicode:

code:
1
2
3
4
5
6
7
8
>>> data=unicode("mëëh","iso-8859-1")
>>> import codecs
>>> f=codecs.open("foo.txt","w",encoding="iso-8859-1")
>>> f.write(data)
>>> f.close()
>>> open("foo.txt").read()
'm\x89\x89h'
>>>


vervang "iso-8859-1" in de codecs.open() call door de character encoding die je wilt gebruiken voor je file.

FireFox - neem het web in eigen hand


  • cyberstalker
  • Registratie: September 2005
  • Niet online

cyberstalker

Eersteklas beunhaas

Topicstarter
Die codecs module kende ik niet. Daarmee is het inderdaad opgelost. Ontzettend bedankt :) .

Ik ontken het bestaan van IE.

Pagina: 1