UnicodeEncodeError: 'ascii' codec: problème classique mais…
Bonjour à tous,
Je débute en Python parce que mes travaux d'étudiants m'amènent à utiliser networkX pour l'analyse de graphes.
J'ai un problème avec des chaînes unicodes provenant de fichiers graphml (xml donc). En voici un à titre d'exemple:
Code:
1 2 3 4 5 6 7 8 9
| <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<graphml xmlns="http://graphml.graphdrawing.org/xmlns">
<key attr.name="label" attr.type="string" for="node" id="d1"/>
<graph edgedefault="directed" id="G">
<node id="1">
<data key="d1">A name with unicode: «é è» </data>
</node>
</graph>
</graphml> |
Si je lis ce fichier et que je tente d'imprimer la chaîne sur la sortie standard, je n'ai pas de problèmes. Par contre, si je redirige vers un fichier ou un pipe, j'ai le message d'erreur plus bas.
Le script de lecture-affichage:
Code:
1 2 3 4 5 6 7 8 9 10 11 12
| #!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
import networkx as nx
input_file = sys.argv[1]
G = nx.read_graphml(path=input_file)
label = G.node['1']['label']
print type(label)
print label |
Le résultat:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| $ ./test.py single.graphml
<type 'unicode'>
A name with unicode: «é è»
$ ./test.py single.graphml > /dev/null
<type 'unicode'>
Traceback (most recent call last):
File "./test.py", line 12, in <module>
print label
UnicodeEncodeError: 'ascii' codec can't encode characters in position 21-22: ordinal not in range(128)
$ ./test.py single.graphml | less
<type 'unicode'>
Traceback (most recent call last):
File "./test.py", line 12, in <module>
print label
UnicodeEncodeError: 'ascii' codec can't encode characters in position 21-22: ordinal not in range(128)
$ set | grep LANG
LANG=fr_BE.UTF-8
LANGUAGE=fr_BE:fr |
Si au lieu de passer par la sortie standard, j'écris directement dans un descripteur de fichier, le problème est le même:
Code:
1 2
| f = open('foo', 'a')
f.write(label) |
Je travaille sous Debian Wheezy. L'encodage dans le terminal n'a jamais posé de problèmes.
Si quelqu'un a une piste…
Merci d'avance,
G.
UnicodeEncodeError: 'ascii' codec: problème classique mais…
Citation:
Envoyé par
VinsS
salut,
Faut préciser l'encodage:
Code:
1 2 3 4
|
>>> txt = u'éàôï'
>>> with open('text', 'w') as outf:
... outf.write(txt.encode('utf-8')) |
Merci.
Et si je veux rediriger la sortie standard simplement via un pipe, sans ouvrir un descripteur dans le script ?