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 :

Problème de open()


Sujet :

Python

  1. #1
    Membre éclairé
    Inscrit en
    Mai 2008
    Messages
    317
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 317
    Par défaut Problème de open()
    Bonjour à tous.

    Et bien voila, j'ai un soucis pour lire un fichier txt:
    lorsque je j'ouvre le fichier avec notepad ou gedit, la première ligne est:
    "Windows Registry Editor Version 5.00"
    mais si je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    fp = open(lefichier, 'r')
    print fp.read()
    le resultat de le première ligne est:
    ÿþWindows Registry Editor Version 5.00
    sauf qu'il y a des caractère spéciaux (interprété par des caré) entre chacune des lettres...
    wtf ? oO

    j'ai déjà essate open() et file() avec different mode de lecture (r, rb rU ...)
    Je sais pas comment faire la...

    merci d'avance

  2. #2
    Membre Expert 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
    Par défaut
    Bonjour,

    C'est quoi ton éditeur sous Windows ?
    J'ai le même problème lorsque je modifie mon code sous Windows. Sans doute une option mais comme je ne travaille (presque) que sous linux au niveau code je n'ai pas encore regarder.

    @+

  3. #3
    Membre éclairé
    Inscrit en
    Mai 2008
    Messages
    317
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 317
    Par défaut
    et bien en pratique y'a pas d'éditeur de texte, le fichier est généré en DOS,
    c'est un export de base de registre, et je cherche a remplacer le nom de l'utilisateur exporter par celui de l'utilisateur courant.

    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
    print " * Export de la base de registre...",
    try:
        os.system('@reg export "HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Windows Messaging Subsystem\Profiles\Outlook" "C:\Temp\RegExport.reg"')
    except:
        pass
    if(os.path.isfile("C:\Temp\RegExport.reg")):
        try:
            fp = open("C:\Temp\RegExport.reg",'r')
            fReg = str(fp.read())
            fp.close()
            fReg = fReg.replace('%s\\' % selectedUserDir, "[USERREPLACE]\\")
            fp = open("C:\Temp\RegExport2.reg", "w")
            fp.write(fReg)          
            fp.close()
            addText+="[OK]\n"
            print "[OK]"
        except:
            print "[ERROR] Modification de base de registre"

  4. #4
    Membre éclairé
    Inscrit en
    Mai 2008
    Messages
    317
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 317
    Par défaut
    Ah du nouveau !
    En ouvrant le fichier en question sous linux avec nano, la première ligne donne ça:

    W^@i^@n^@d^@o^@w^@s^@ ^@R^@e^@g^@i^@s^@t^@r^@y^@ ^@E^@d^@i^@t^@o^@r^@ ^@V^@e^
    Lol ^^
    Microsoft c'est vraiment trop fort, j'imagine déjà leurs ingé:
    "Eh mais, si on met rien entre chaque lettre ça paraitrait trop normal !, si on inventait un standards ou on rajouterai des caractères inexistants entre chaque lettre juste pour rendre le fichier plus lourd, et moins lisible ?"
    ^^ sry, mini troll ^^

    Si quelqu'un sait comment forcer la convertion en full texte ?
    Sinon je vais essayé de voir si en passant une regex ça le fait... m'enfin c'est ultra crado quand même...

  5. #5
    Membre éclairé
    Inscrit en
    Mai 2008
    Messages
    317
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 317
    Par défaut
    Bon bah apparement j'ai réussis a avoir ce que je voulais grace a ça:

    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
    try:
        os.system('@reg export "HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion" "C:\Temp\RegExport.txt"')
    except:
        pass
     
    def onlyascii(char):
        if ord(char) < 1 or ord(char) > 127:
            return ''
        else: return char
     
    f=open('C:\Temp\RegExport.txt','r')
    data=f.read()
    f.close()
    filtered_data=filter(onlyascii, data)
     
    f=open('C:\Temp\RegExport2.txt','w+')
    f.write(filtered_data)
    f.close()
    ça supprime les caractères non-ascii ainsi que le caractère nul (c'est celui qui s'insérait entre chaque lettre)
    Donc voila, problème résolu ^^

    200ème message ^^
    Merci ++

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 738
    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 738
    Par défaut
    Salut
    Pour l'instant, çà dit que ces "caractères" sont codés sur deux octets...
    Si NotePad et GEdit s'en sortent "mieux", c'est peut être qu'ils arrivent à trouver le "codage" à partir du BOM - byte order mark -.
    Essayez de dumper la première ligne en hexa.
    On devrait avoir un BOM disant texte codé UTF-16
    - W
    PS: fichier == suite d'octets est un faux ami.
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Membre éclairé
    Inscrit en
    Mai 2008
    Messages
    317
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 317
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut
    Pour l'instant, çà dit que ces "caractères" sont codés sur deux octets...
    Si NotePad et GEdit s'en sortent "mieux", c'est peut être qu'ils arrivent à trouver le "codage" à partir du BOM - byte order mark -.
    Essayez de dumper la première ligne en hexa.
    On devrait avoir un BOM disant texte codé UTF-16
    - W
    PS: fichier == suite d'octets est un faux ami.
    heu, je pense pas que ça soit sur deux octet, je m'explique:

    lorsque j'ouvre le fichier avec un editeur hexa, il y a un caractère null entre chaque caratères ( x00 en hexa), je pense que c'est nano qui interprète ce caractère null par "^@"

    C'est pour ça que j'ai fais un filtre ascii, je supprime tout les caractère non ascii + le premier (le caractère null)
    Ca marche du feu de dieu :p

    Le fichier deviens éditable par un editeur de texte (tel que nano ou vi), la taille du fichier est divisée par deux, et l'import du fichier reg généré marche très bien...

    merci

  8. #8
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 738
    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 738
    Par défaut
    Salut,
    Ce que j'en dis est que la façon propre de decoder la chose est de lire le BOM de la façon suivante (par exemple):
    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
    import codecs, sys
     
    bomdict = {
        codecs.BOM_UTF8 : 'UTF8', \
        codecs.BOM_UTF16_BE : 'UTF-16BE', \
        codecs.BOM_UTF16_LE : 'UTF-16LE',
        }
     
    def get_content(filename):
        f = open(filename, 'r')
        contents = f.read()
        for bom, encoding in bomdict.items():
            if contents.startswith(bom):
                return contents[len(bom):].decode(encoding)
     
    if __name__ == '__main__':
        filename = 'xxx.reg'
        print get_content(filename)
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

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

Discussions similaires

  1. Problème window.open avec IE
    Par karibouxe dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 03/10/2006, 10h37
  2. problème avec open
    Par User dans le forum Langage
    Réponses: 3
    Dernier message: 21/09/2006, 13h33
  3. problème avec open()
    Par aliassaf dans le forum Général Python
    Réponses: 1
    Dernier message: 26/06/2006, 00h27
  4. Problème avec opener.location.reload
    Par Joooooon dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 11/06/2006, 18h58
  5. Problème avec open() [Excel VBA]
    Par Invité dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 28/11/2005, 16h21

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