IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

encodage fichier csv problématique sous windows


Sujet :

Python

  1. #1
    Membre Expert
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 617
    Par défaut encodage fichier csv problématique sous windows
    Bonsoir,

    Je crée des fichiers csv à partir d'un seul.
    Tout fonctionne à merveille sous linux.
    Ces fichiers csv créés sont en utf-8, comme tout le reste, d'ailleurs.

    Le souci se situe avec Windows.
    De façon étrange, lorsque le contenu possède des caractères accentués, ils ne sont pas reconnus.
    Ainsi, je souhaite par exemple remplacer "créée" par "cr" et ceci ne fonctionne pas sous windows. "créée" reste tel quel.

    Il n'y a aucun message d'erreur mais les résultats ne sont pas identiques.
    Je souhaiterais que des collègues puissent faire tourner mon programme sous Windows mais ce n'est pas possible actuellement.

    Des idées ?

  2. #2
    Membre expérimenté
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2011
    Messages : 180
    Par défaut
    Bonjour

    Pourriez-vous, s'il vous plaît, fournir un code minimal fonctionnel ?

    Sous quelle version de python êtes-vous, coté Linux et coté Windows ?

    Merci

  3. #3
    Membre Expert
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 617
    Par défaut
    Citation Envoyé par chticricri Voir le message
    Bonjour

    Pourriez-vous, s'il vous plaît, fournir un code minimal fonctionnel ?

    Sous quelle version de python êtes-vous, coté Linux et coté Windows ?

    Merci

    J'avance : j'ai réussi à faire tourner le programme sous windows et sous linux mais en réenregistrant le fichier csv (il est à l'origine en xls).
    Sous Windows (version 8, chez moi), le fichier est encodé de façon automatique en latin1 et non en utf-8, comme le fait linux autyomatiquement.

    Je travaille avec Python3, sous windows et linux.

    Si je n'arrive pas à faire ce que je veux, j'essaierai de fournir un code mais pour l'instant, je pense savoir ce qu'il faut que je fasse :
    Il faudrait que, lorsque je le système détecte la version windows (cela, c'est facile), le fichier csv, initialement encodé en latin1, soit encodé en utf8. Est-ce possible ?

  4. #4
    Membre Expert
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 617
    Par défaut
    A la base, je travaille avec un fichier téléchargé sur le net et lorsqu'il est téléchargé puis converti via excel en csv, il est codé en latin1 avec windows.

    Si j'utilise ce fichier sous linux, j'ai l'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe9 in position 46: invalid continuation byte

  5. #5
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 068
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 068
    Par défaut
    Pour éviter les erreurs je conseillerais de lire et écrire en mode binaire, car l'encodage ne se fait pas toujours sur un octet (caractères accentués), il est donc conseillé de comparer octet par octet, en se mettant en mode 'rb', recevoir des bytes, comparer et faire une transformation d'octets (bytes) en str, par le biais de mesbytes.decode("utf8") pour un affichage à l'écran.

  6. #6
    Membre Expert
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 617
    Par défaut
    Merci pour ce conseil mais j'ai des fichiers de 120 lignes et 30 colonnes environ que je ne traite pas en bloc car les cellules doivent être traitées séparément. Du coup, je crains que ce soit lourd.

    En fait, j'ai réussi à faire ce que je voulais. Sauf que j'ai dû modifier tout mon code et faire une version pour linux et une autre version pour windows. Cela ne me convient que moyennement.

    Pour que cela fonctionne, il a fallu que je mette, sous Windows, un codage du fichier python en latin1.
    De plus, mes fichiers csv finaux sont traités par un autre programme (LaTeX) et du coup, il faut aussi que j'adapte cela (je l'ai fait mais c'est un peu lourd).

    Pour que ce soit simple, j'ai deux choix à mon avis si c'est possible (comme je connais mal Windows, je ne sais pas trop) :
    - convertir le fichier .csv codé en latin1 en codage utf8
    - convertir mes fichiers .tex (c'est comme du .txt) d'utf8 en latin1

    Si quelqu'un connaît la réponse à une des deux possibilités, je suis preneur.

  7. #7
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 762
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 762
    Par défaut
    Salut,

    Le soucis est que si le fichier CSV est produit sur windows et traité sur Linux, son "encoding" aura peut de chance d'être celui "par défaut".
    Avec Python3, le module csv travaille sur de l'unicode.
    Si votre fichier n'est pas codé avec le coding par défaut, il suffit de le préciser à l'open.

    Après la question est de savoir si on impose à tous les fichiers d'être utf-8 (ce qui me semble raisonnable), si on demande à l'utilisateur de préciser l'encoding à utiliser ou si on essaie de deviner l'encoding du fichier avec un module comme chardet.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  8. #8
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Quand on exporte un tableau Excel français en fichier csv, il est construit en cp1252 (version "Microsoft" du latin1).

    Et sous Python 3, on peut lire et écrire dans n'importe quel encodage: il suffit de le dire à l'ouverture du fichier.

    Donc, rien n'empêche que les fichiers soient en cp1252 tout le temps, y compris sous Linux! De toute façon, après lecture, le travail en mémoire se fait en unicode dans tous les cas.

    S'il y avait en plus des échanges avec d'autres tableurs (type openoffice), ce serait plus compliqué. Mais est-ce le cas?

  9. #9
    Membre Expert
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 617
    Par défaut
    Citation Envoyé par tyrtamos Voir le message
    Bonjour,

    Quand on exporte un tableau Excel français en fichier csv, il est construit en cp1252 (version "Microsoft" du latin1).

    Et sous Python 3, on peut lire et écrire dans n'importe quel encodage: il suffit de le dire à l'ouverture du fichier.

    Donc, rien n'empêche que les fichiers soient en cp1252 tout le temps, y compris sous Linux! De toute façon, après lecture, le travail en mémoire se fait en unicode dans tous les cas.

    S'il y avait en plus des échanges avec d'autres tableurs (type openoffice), ce serait plus compliqué. Mais est-ce le cas?
    Ok, merci à tous les deux.

    En fait, je télécharge un fichier excel qui est sur le net.
    Ensuite, je le convertis en .csv.
    A partir de ce fichier .csv, j'en crée 3 autres (.csv) que j'utilise ensuite pour créer des fichier .tex (ou .txt).

  10. #10
    Membre Expert
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 617
    Par défaut
    J'ai bien avancé :
    Mon programme python marche sous windows ET sous linux (pas testé sur Mac) MAIS :
    - sous linux, mon entête est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    # -*- coding: utf-8 -*-
    - sous windows, elle est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    # -*- coding: latin1 -*-
    La solution la plus simple pour moi, si c'est possible, serait que l'encodage soit défini en fonction de l'OS.
    J'envisageais une solution du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if sys.platform == "win32":
        # -*- coding: latin1 -*-   
    else:
        # -*- coding: utf-8 -*-
    mais évidemment, cela ne marche pas.
    J'ai regardé du côté de sitecustomize mais je n'y comprends rien.
    Je précise encore que je travaille sous python 3.

    Est-ce quelqu'un sait faire cela ?

    [edit] Si personne n'a la réponse, ce n'est pas dramatique car j'ai réussi à tout passer en latin1, que ce soit sous linux ou sous windows.

  11. #11
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Citation Envoyé par marco056 Voir le message
    [edit] Si personne n'a la réponse, ce n'est pas dramatique car j'ai réussi à tout passer en latin1, que ce soit sous linux ou sous windows.
    Ce n'est pas étonnant, car la ligne en question ne veut pas dire que Python travaille avec l'encodage en question, mais que les chaines de caractères codées en dur dans la page sont enregistrées avec cet encodage. Ce qui permettra à Python 3 de les lire en les convertissant en unicode sans erreur.

    Attention: cela nécessite que les fichiers .py en question aient été effectivement enregistrés avec cet encodage par l'éditeur de texte utilisé!

    En ce qui me concerne, je travaille couramment sous Windows, Linux et (un peu) OSX, et tous mes fichiers .py sont en 'utf-8'. Le grand avantage de l'utf-8 étant qu'il est capable de traiter toutes les langues du monde.
    Voilà par exemple "bonjour" en chinois traditionnel (d'après google!) qui n'aurait pas pu être enregistré en latin1:

    ch = "你好"

  12. #12
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 762
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 762
    Par défaut
    Salut,

    Citation Envoyé par marco056 Voir le message
    Mon programme python marche sous windows ET sous linux (pas testé sur Mac) MAIS :
    - sous linux, mon entête est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    # -*- coding: utf-8 -*-
    - sous windows, elle est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    # -*- coding: latin1 -*-
    La solution la plus simple pour moi, si c'est possible, serait que l'encodage soit défini en fonction de l'OS.
    J'envisageais une solution du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if sys.platform == "win32":
        # -*- coding: latin1 -*-   
    else:
        # -*- coding: utf-8 -*-
    mais évidemment, cela ne marche pas.
    Les fichiers scripts Python sont des fichiers textes tout comme les fichiers CSV.
    Si vous voulez que l'encodage des fichiers soit "fonction de l'OS", cela suppose les convertir lorsque vous passez d'un OS à l'autre.
    Pour les fichiers scripts Python, il ne suffit pas de changer "coding: utf-8" en "coding: latin-1" pour que çà fonctionne: il faut aussi convertir le reste du fichier (les chaines de caractères "literals" contenant des caractères non-ASCII).
    Avec Python3, le coding par défaut des scripts Python étant "utf-8", le plus simple est de ne pas préciser "coding: ..." et de ne pas modifier le fichier script (sauf si votre IDE "utilise" cette information pour savoir comment lire/écrire le fichier script).

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  13. #13
    Membre Expert
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 617
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,



    Les fichiers scripts Python sont des fichiers textes tout comme les fichiers CSV.
    Si vous voulez que l'encodage des fichiers soit "fonction de l'OS", cela suppose les convertir lorsque vous passez d'un OS à l'autre.
    Pour les fichiers scripts Python, il ne suffit pas de changer "coding: utf-8" en "coding: latin-1" pour que çà fonctionne: il faut aussi convertir le reste du fichier (les chaines de caractères "literals" contenant des caractères non-ASCII).
    Avec Python3, le coding par défaut des scripts Python étant "utf-8", le plus simple est de ne pas préciser "coding: ..." et de ne pas modifier le fichier script (sauf si votre IDE "utilise" cette information pour savoir comment lire/écrire le fichier script).

    - W

    Oui, mais le souci, c'est que je crée 3 fichiers tex, qui sont, eux, codés par défaut en utf-8 donc sous windows, ça plante.

    Comme je le disais plus haut, j'ai réglé le souci.

    De plus, j'ai un copain qui a fait un script permettant de convertir le codage de ces fichiers texte, donc, je risque de passer par un autre chemin.

  14. #14
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 762
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 762
    Par défaut
    Citation Envoyé par marco056 Voir le message
    Oui, mais le souci, c'est que je crée 3 fichiers tex, qui sont, eux, codés par défaut en utf-8 donc sous windows, ça plante.
    En supposant que vos fichiers .tex sont des "scripts" LaTeX, vous devez/pouvez préciser l'encoding en intégrant l'instruction qui va bien "dans" le fichier produit (comme pour un script Python). Sinon, çà va essayer de lire suivant un "défaut" qui ne sera pas ce que vous voulez.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  15. #15
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 243
    Par défaut
    hello,
    pour indiquer le type d' encodage dans un document latex voir ici

    Ami calmant, J.P

  16. #16
    Membre Expert
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 617
    Par défaut
    Citation Envoyé par jurassic pork Voir le message
    hello,
    pour indiquer le type d' encodage dans un document latex voir ici

    Ami calmant, J.P
    Merci à vous : j'utilise LaTeX depuis 4 ou 5 ans et je maîtrise la bête.

    Pour résumer ce que je fais et pour indiquer la solution que j'ai trouvée au final (en fait j'ai trouvé 2 options) :

    ce que je fais :
    - je télécharge un fichier .xls sur le net
    - je le convertis en .csv
    - je traite pour en faire 2 autres fichiers .csv
    - ces 2 tableaux sont ensuite écrits dans 2 fichiers .tex différents (sans préambule, donc sans codage spécifique, par défaut utf-8)
    - j'écris un fichier principal dans lequel est préciser le codage.

    Évidemment, si les tableaux .tex n'ont pas le même codage que le fichier principal, cela coince.
    Sous linux chez moi, tout est en utf8, donc pas de souci.
    Par contre, avec windows, tout part en latin1 au départ et comme les fichiers .tex sont codés par défaut en utf-8, cela ne fonctionne pas.
    La solution que je retiens pour l'instant est de passer tout (fichiers .csv et fichiers .tex) en latin1 de façon à ne plus avoir de conflit.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Encodage fichier csv sous Linux
    Par cisnake dans le forum Tomcat et TomEE
    Réponses: 16
    Dernier message: 24/01/2014, 14h27
  2. Mon fichier gtkrc fonctionne sous windows mais pas sous Linux !
    Par Kicker dans le forum GTK+ avec C & C++
    Réponses: 2
    Dernier message: 24/04/2009, 12h54
  3. Réponses: 7
    Dernier message: 09/09/2007, 15h34
  4. Copier des fichiers en Perl sous Windows XP
    Par Pauli dans le forum Langage
    Réponses: 1
    Dernier message: 19/02/2007, 09h40
  5. [TP] Création fichier texte lisible sous Windows
    Par frechy dans le forum Turbo Pascal
    Réponses: 2
    Dernier message: 02/03/2006, 20h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo