+ Répondre à la discussion
Affichage des résultats 1 à 9 sur 9
  1. #1
    Invité de passage
    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 : 1
    Points
    1

    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 Confirmé Sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    février 2006
    Messages
    4 759
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    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 : 4 759
    Points : 10 913
    Points
    10 913

    Par défaut

    Salut
    Je pense qu'un truc de ce genre devrait le faire
    Code python :
    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 :
    1
    2
    for f in os.listdir("repertoire_contenant_les_.txt"):
        convert(f)
    Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
    Tout ce qu'un individu reçoit sans rien faire pour l'obtenir, un autre individu a dû travailler pour le produire sans en tirer profit.
    Tout Pouvoir ne peut distribuer aux uns que ce qu'il a préalablement confisqué à d'autres car on n'accroît pas les biens en les divisant.
    Quand la moitié d'un peuple croit qu'il ne sert à rien de faire des efforts car l'autre moitié les fera pour elle, et quand cette dernière moitié se dit qu'il ne sert à rien d'en faire car ils bénéficieront à d'autres, cela s'appelle le déclin et la fin d'une nation.
    Dr. Adrian Rogers (1931-2005)

  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 720
    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 720
    Points : 3 953
    Points
    3 953

    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 :
    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
    Invité de passage
    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 : 1
    Points
    1

    Par défaut

    bonjour

    je travaille sous python 2.7.3

  5. #5
    Invité de passage
    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 : 1
    Points
    1

    Par défaut

    en essayant de convertir de utf16 a latin 1 j'ai obtenu l'erreur suivante

    Code :
    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
    Invité de passage
    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 : 1
    Points
    1

    Par défaut

    j'ai utilisé le code suivant pour convertir le fichier de utf16 à utf-8 puis a ansi
    Code :
    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 :
    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 confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    mai 2011
    Messages
    152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

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

    Informations forums :
    Inscription : mai 2011
    Messages : 152
    Points : 244
    Points
    244

    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
    Modérateur

    Homme Profil pro
    Architecte technique
    Inscrit en
    juin 2008
    Messages
    5 662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Industrie

    Informations forums :
    Inscription : juin 2008
    Messages : 5 662
    Points : 8 560
    Points
    8 560

    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 :
    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 :
    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 :
    1
    2
    3
    4
    >>> import HTMLParser
    >>> h = HTMLParser.HTMLParser()
    >>> print (h.unescape(t))
    éùz
    - W
    Architectures Post-Modernes

  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 720
    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 720
    Points : 3 953
    Points
    3 953

    Par défaut

    Bonjour,

    Citation Envoyé par assoum27 Voir le message
    Code :
    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.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •