Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 30/11/2015, à 00:17

Ferod

[Résolu] Pb d'encodage lors de l'utilisation etree avec python

Bonjour

J'ai fait un script python qui m'aide à la mise à jour des bâtiments pour openstreetmap. Ce script prend en entrée des fichier osm qui sont en réalité des fichier xml. Jusqu'à maintenant j'ai fait une version qui lit le fichier sans utiliser le parser xml de python. J'ai décidé de changer ça ce week end et d'utiliser etree mais je butte sur un problème d'encodage.
Sous python 2.7 j'obtiens l'erreur suivante :

sebastien@wily:BatiOsm$ python test7.py aa.osm 
Traceback (most recent call last):
  File "test7.py", line 29, in <module>
    file_res.write(res_export + "\n")
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 40: ordinal not in range(128)

Aucun problème avec python3 :

sebastien@wily:BatiOsm$ python3 test7.py aa.osm 
sebastien@wily:BatiOsm$ 

Plutôt que de vous renvoyer vers le programme entier j'ai fait un extract qui permet de reproduire le problème.

Je sens que c'est lié à ce qu'explique glyph ici : http://stackoverflow.com/questions/3418 … 6#12345506 mais j'ai du mal à comprendre ce que je dois faire.

Merci pour votre aide.

fichier test7.py

# -*- coding:Utf-8 -*-
#!/usr/bin/env python
import sys
import lxml.etree

adresse = sys.path[0]
file_osm = sys.argv[1]
liste_tag = []

utf8_xml_parser = lxml.etree.XMLParser(encoding='utf-8')
file_tree = lxml.etree.parse(file_osm, parser=utf8_xml_parser)
for way in file_tree.iter('way'):
    for tag in way.findall('./tag'):
        liste_tag.append(tag.get('v'))

res_export = ""
i = 0
while i < len(liste_tag):
    res_export = res_export + liste_tag[i] + "\n"
    i = i + 1

file_res = open(adresse + '/res_test7.osm', 'w')
file_res.write(res_export + "\n")
file_res.close()

fichier aa.osm

<?xml version="1.0" encoding="UTF-8"?>
<osm version="0.6" upload="true" generator="JOSM">
  <way id="-5191" visible="true">
    <nd ref="-23099" />
    <nd ref="-23106" />
    <nd ref="-30080" />
    <nd ref="-30081" />
    <nd ref="-30082" />
    <nd ref="-30083" />
    <nd ref="-23099" />
    <tag k="source" v="cadastre-dgi-fr source : Direction Générale des Finances Publiques - Cadastre. Mise à jour : 2015" />
    <tag k="building" v="yes" />
    <tag k="wall" v="no" />
  </way>
  <node id="-23099" action="modify" visible="true" lat="43.248784" lon="-0.439504" />
  <node id="-23106" action="modify" visible="true" lat="43.248743" lon="-0.439547" />
  <node id="-30080" action="modify" visible="true" lat="43.24873" lon="-0.439524" />
  <node id="-30081" action="modify" visible="true" lat="43.248731" lon="-0.43951" />
  <node id="-30082" action="modify" visible="true" lat="43.248761" lon="-0.439479" />
  <node id="-30083" action="modify" visible="true" lat="43.248771" lon="-0.439481" />
  <node id="-23099" action="modify" visible="true" lat="43.248784" lon="-0.439504" />
  <way id="-4082" visible="true">
    <nd ref="-23017" />
    <nd ref="-23206" />
    <nd ref="-23207" />
    <nd ref="-23018" />
    <nd ref="-23017" />
    <tag k="source" v="cadastre-dgi-fr source : Direction Générale des Finances Publiques - Cadastre. Mise à jour : 2015" />
    <tag k="building" v="yes" />
    <tag k="wall" v="no" />
  </way>
  <node id="-23017" action="modify" visible="true" lat="43.252092" lon="-0.430922" />
  <node id="-23206" action="modify" visible="true" lat="43.252041" lon="-0.430856" />
  <node id="-23207" action="modify" visible="true" lat="43.25204" lon="-0.430849" />
  <node id="-23018" action="modify" visible="true" lat="43.252076" lon="-0.430839" />
  <node id="-23017" action="modify" visible="true" lat="43.252092" lon="-0.430922" />
</osm>

Dernière modification par Ferod (Le 30/11/2015, à 20:06)


"When I was in the military, they gave me a medal for killing
two men, and a descharge for loving one !" Leonard Matlovich

Hors ligne

#2 Le 30/11/2015, à 08:48

pingouinux

Re : [Résolu] Pb d'encodage lors de l'utilisation etree avec python

Bonjour,
En python2, ça semble marcher en remplaçant l'avant-dernière ligne de ton script

file_res.write(res_export + "\n")

par

file_res.write((res_export + "\n").encode('utf-8'))

Hors ligne

#3 Le 30/11/2015, à 20:01

Ferod

Re : [Résolu] Pb d'encodage lors de l'utilisation etree avec python

Parfait ! Je confirme que ça a bien résolu mon problème.
Merci beaucoup pingouinux !


"When I was in the military, they gave me a medal for killing
two men, and a descharge for loving one !" Leonard Matlovich

Hors ligne

#4 Le 30/11/2015, à 20:09

pingouinux

Re : [Résolu] Pb d'encodage lors de l'utilisation etree avec python

Tu peux éventuellement jeter un œil à L’encoding en Python, une bonne fois pour toute.

Hors ligne

#5 Le 01/12/2015, à 22:13

Ferod

Re : [Résolu] Pb d'encodage lors de l'utilisation etree avec python

Sam & Max a écrit :

Et là, pour vous en sortir, vous en avez chié des ronds de pâté.

big_smile
De suite je me sens concerné !


"When I was in the military, they gave me a medal for killing
two men, and a descharge for loving one !" Leonard Matlovich

Hors ligne