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:
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.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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>
Le script de lecture-affichage:
Le résultat:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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
Je travaille sous Debian Wheezy. L'encodage dans le terminal n'a jamais posé de problèmes.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 f = open('foo', 'a') f.write(label)
Si quelqu'un a une piste…
Merci d'avance,
G.
Partager