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 :

Convertir un fichier UTF16 en Ansi sous python


Sujet :

Python

  1. #1
    Futur Membre du Club
    TALN:inférence grammaticale
    Inscrit en
    Avril 2010
    Messages
    16
    Détails du profil
    Informations professionnelles :
    Activité : TALN:inférence grammaticale

    Informations forums :
    Inscription : Avril 2010
    Messages : 16
    Points : 7
    Points
    7
    Par défaut Convertir un fichier UTF16 en Ansi sous python
    Bonjour,

    j'ai un fichier txt ecrie en unicode (utf16) et je veux le convertir en ansi

    je peux le faire manuelement en allant a enregistrer sous et modifier de UNICODE a ANSI sauf que je suis entratrain de créer une Base de donnée qui contien un nombre volumineux de fichier TXT que je doit convertir en ANSI sous PYTHON

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 631
    Points : 30 865
    Points
    30 865
    Billets dans le blog
    1
    Par défaut
    Salut
    Je pense qu'un truc de ce genre devrait le faire
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    import os
    def convert(nom):
        f1=open(nom, "r")
        f2=open("%s.tmp" % nom, "w")
        for l in f1: f2.write(l.decode("utf-16").encode("latin-1")
        f1.close()
        f2.close()
        os.rename("%s.tmp" % nom, nom)
    # convert()

    Puis, dans le main
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for f in os.listdir("repertoire_contenant_les_.txt"):
        convert(f)
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonsoir,

    Il serait bien que assoum27 nous dise la version de Python utilisée... (open/codecs, str.encode, etc...)

    Sinon en Python 2 c'est plus, pour le code donné
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    def convert(nom):
        with open("%s.tmp" % nom, "w") as f2:
            with open(nom, "r") as f1:
                f2.write(f1.read().decode("UTF-16").encode("UTF-8"))
        os.rename("%s.tmp" % nom, nom)
    Mais bon... Pas de test ou quoi de ce soit dans tout cela...

    @+
    Merci d'utiliser le forum pour les questions techniques.

  4. #4
    Futur Membre du Club
    TALN:inférence grammaticale
    Inscrit en
    Avril 2010
    Messages
    16
    Détails du profil
    Informations professionnelles :
    Activité : TALN:inférence grammaticale

    Informations forums :
    Inscription : Avril 2010
    Messages : 16
    Points : 7
    Points
    7
    Par défaut
    bonjour

    je travaille sous python 2.7.3

  5. #5
    Futur Membre du Club
    TALN:inférence grammaticale
    Inscrit en
    Avril 2010
    Messages
    16
    Détails du profil
    Informations professionnelles :
    Activité : TALN:inférence grammaticale

    Informations forums :
    Inscription : Avril 2010
    Messages : 16
    Points : 7
    Points
    7
    Par défaut
    en essayant de convertir de utf16 a latin 1 j'ai obtenu l'erreur suivante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
       f2.write(f1.read().decode("UTF-16").encode("latin-1"))
    UnicodeEncodeError: 'latin-1' codec can't encode characters in position 0-4: ordinal not in range(256)

  6. #6
    Futur Membre du Club
    TALN:inférence grammaticale
    Inscrit en
    Avril 2010
    Messages
    16
    Détails du profil
    Informations professionnelles :
    Activité : TALN:inférence grammaticale

    Informations forums :
    Inscription : Avril 2010
    Messages : 16
    Points : 7
    Points
    7
    Par défaut
    j'ai utilisé le code suivant pour convertir le fichier de utf16 à utf-8 puis a ansi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    def convert2(nom):
     
        with open("%s.tmp" % nom, "w") as f2:
            with open(nom, "r") as f1:
                f2.write(f1.read().decode("UTF-16").encode("utf-8"))
        os.rename("%s.tmp" % nom, nom+"utf-8.txt")
     
        with open("%s.tmp" % nom, "w") as f2:
            with open(nom, "r") as f1:
                f2.write(f1.read().decode("UTF-8").encode("latin-1"))
        os.rename("%s.tmp" % nom, nom+"latin-1.txt")

    Si on le fait manuellement ca marche mais avec pytho n le fichier en sortie ressemblai a ça .




    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     E'13  'DB'/E
     
     #H1/  'DEHB9  'D'DC*1HFJ  DBF')  A1'F3    #F  'DB'6J  'DA1F3J  DEC'A-)  'D%1G'(  E'1C  *1JAJ/JC  *DBI  EH'AB)  EF  'D3D7'*  'D,2'&1J)  DD3E'-  DG  ('DB/HE  %DI  'D*1'(  'DH7FJ  B5/  'D*-BJB  AJ  B6J)  EB*D  1G('F  *J(-J1JF  ('DE/J)  3F)  
     
     #6'A*  A1'F3  #F  'DB'6J  'DA1F3J  E1*B(  -6H1G  %DI  'D,2'&1  AJ  4G1  E'13  'DB'/E  :J1  #FG  DE  J-5D  9DI  #J  6E'F'*  (.5H5  7D(JF  *B/E  (GE'  'D#HD  J*9DB  ('3*,H'(  E'  JB'1(  4.5'  J9*(1  4G'/*GE  EA*'-  'DB6J).   #E'  'D7D(  'D+'FJ  AJ*9DB  ('3*.1',  ,++  'D6-'J'  H%,1'!  *-'DJD  9DI  -E6GE  'DFHHJ  HC0'

  7. #7
    Membre averti
    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
    Points : 321
    Points
    321
    Par défaut
    Bonjour,

    Ton erreur n'est pas vraiment une surprise. Il faut savoir que unicode permet
    de coder des textes dans pratiquement toutes les langues existante, et même quelques langues ancienne.

    Pour bien faire, il faudrait que tu poste le fichier (ou un extrait du fichier) sur lequel l'erreur s'est déclenchée.

    Sinon une piste : Dans quel langues sont tes fichier UTF-16 ? Si tout est en français, ok il n'y a aucun problème avec latin-1. Peut être que ton fichier contient des caractère dans une autre langue dont certaine lettre n'est pas dans latin-1.

    Deux pistes :

    • Programme en batch ==> générer un fichier d'erreur et ou ignorer les erreurs de conversion (caractère de substitution)
    • En interactif, détecter l'erreur et permettre à l'utilisateur de sélectionner une page de code (ANSI)


    Sinon tu peux aussi t'amuser à analyser le fichier de façon a détecter la page de code.

    Sans oublier, bien sûr que tous les fichiers unicode ne sont pas nécessairement convertibles en ANSI, alors que l'inverse l'est.

    Bon courage

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 242
    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 242
    Points : 36 699
    Points
    36 699
    Par défaut
    Salut,

    Je ne sais pas dans quelle mesure ce sujet fait suite à celui ci.
    S'il y a problème pour convertir "utf-16/utf-8" en "ASCII" ou en "latin-1", la méthode encode traitant les impossibilités en mode "strict" retournera une exception chaque fois que la conversion sera "impossible".
    Et c'est le sens de l'erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
       f2.write(f1.read().decode("UTF-16").encode("latin-1"))
    UnicodeEncodeError: 'latin-1' codec can't encode characters in position 0-4: ordinal not in range(256)
    Plutôt que "strict", on peut gérer l'erreur en mode "xmlcharrefreplace".
    Cà fait quoi?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> s = u"éùz"
    >>> t = s.encode('ascii', 'xmlcharrefreplace')
    >>> t
    'éùz'
    les caractères "é" et "ù" sont remplacés par la chaine de la forme '&#'<n>';' ou <n> est la représentation du nombre "unicode".

    Après, reste à décoder.
    Le plus simple étant de faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> import HTMLParser
    >>> h = HTMLParser.HTMLParser()
    >>> print (h.unescape(t))
    éùz
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  9. #9
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonjour,

    Citation Envoyé par assoum27 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    def convert2(nom):
        
        with open("%s.tmp" % nom, "w") as f2:
            with open(nom, "r") as f1:
                f2.write(f1.read().decode("UTF-16").encode("utf-8"))
        os.rename("%s.tmp" % nom, nom+"utf-8.txt")
    
        with open("%s.tmp" % nom, "w") as f2:
            with open(nom, "r") as f1:
                f2.write(f1.read().decode("UTF-8").encode("latin-1"))
        os.rename("%s.tmp" % nom, nom+"latin-1.txt")
    Juste pour signaler un emmelage de pinceau au niveau des noms.

    @+
    Merci d'utiliser le forum pour les questions techniques.

Discussions similaires

  1. Convertir un fichier dvi en pdf sous miktex
    Par OttisToole dans le forum Débuter
    Réponses: 3
    Dernier message: 24/03/2010, 17h09
  2. convertir un fichier texte en ANSI
    Par sculpteur dans le forum Scripts/Batch
    Réponses: 6
    Dernier message: 08/10/2007, 12h38
  3. Convertir un fichier unicode en ansi?
    Par Faiche dans le forum C++
    Réponses: 7
    Dernier message: 06/10/2006, 09h15
  4. [Excel] Convertir un fichier xls en csv sous UNIX
    Par Tsuful dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 14/04/2006, 12h12
  5. convertir un fichier bmp en jpeg (sous visual)
    Par mateo.14 dans le forum MFC
    Réponses: 2
    Dernier message: 24/03/2005, 14h22

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