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 unimarc iso2709 [Python 3.X]


Sujet :

Python

  1. #21
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 949
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 949
    Points : 9 277
    Points
    9 277
    Par défaut
    Hello,
    Citation Envoyé par Sve@r Voir le message
    Tu es prêt à reprendre la lib. Ne te reste qu'à contacter ce "Tiran" (le mainteneur actuel) qui a 40 projets sur le dos et le lui proposer...
    Je ne vais pas m'engager dans cette voie-là sachant que :
    1 - Le projet était en version bêta donc il doit y avoir d'autres bugs.
    2 - Le lien du code source original n'est pas disponible.
    3 - Si personne n'a repris le projet jusqu'à présent c'est qu'il doit y avoir peu de personnes qui l'utilisent.
    4 - Je n'ai modifié qu'une petite partie du projet.

    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  2. #22
    Nouveau membre du Club
    Homme Profil pro
    Loisir / Plaisir
    Inscrit en
    Février 2012
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Loisir / Plaisir

    Informations forums :
    Inscription : Février 2012
    Messages : 32
    Points : 27
    Points
    27
    Par défaut
    Je reviens vers vous, car malgrès mes recherches je ne trouve pas la solution.

    Je souhaiterai pouvoir transformer les notices ISO2709 (ISO5426) en ISO2709 (UTF8).

    J'ai repris la partie du code qui fonctionnait bien avec un extrait de la notice (le titre).

    Je voudrais appliquer la même façon de faire mais avec la notice entière : je suis en echec.

    D'avance merci pour vous précieux conseils.

    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    #!/usr/bin/python3
    # -*- coding: utf-8 -*-
     
    """
    Détecte le type de fichier et son MIME
    Détecte l'encodage du fichier ISO2709 (unimarc).
    Affichage des notices en utf8. -> Problème
     
    chardet (4.0.0)
    pymarc (5.0.0)
    decIso5426 (version jurassic pork - https://www.developpez.net/forums/d2151569/autres-langages/python/general-python/encodage-p-fichier-unimarc-iso2709/)
     
     
    argument 1 -> fichier unimarc
    """
     
     
    import chardet
    import encodings
    import magic
    import pathlib
    import sys
    from decIso5426 import decodeIso5426 as dec5426
    from pymarc import MARCReader
     
     
    def analyse(fichier):
        print("type de fichier : " + magic.from_file(fichier))
        print("type MIME du fichier : " + magic.from_file(fichier, mime = True))
     
        result = chardet.detect(pathlib.Path(fichier).read_bytes())
        charenc = str(result)
        charencencoding = result['encoding']
        print ("l'encodage probable est " + charenc)
     
        with open(fichier, 'rb') as fh:
            if charencencoding == "utf-8":
                reader = MARCReader(fh, to_unicode=True, force_utf8=True)
                analyseurunimarc(reader, charencencoding)
            else:
                try:
                    reader = MARCReader(fh, file_encoding=charencencoding)
                    # lance l'analyseur
                    analyseurunimarc(reader, charencencoding)
                except:
                    print("problème avec le lecteur.")
                    pass
     
    def analyseurunimarc(reader, charencencoding):
        numnotice = 0    # le compteur de notice
        print("Analyseur Unimarc")
        print(charencencoding)
        for record in reader:
            numnotice += 1
            print("----------------------------")
            print("notice numéro : " + str(numnotice))
     
            # But 1 : voir les notices entières.
            # print(record)
            # Résultat 1 : les 3 notices s'affichent mais les caractères accentués posent problèmes.'
     
            # But 2 : obtenir le type de l'élement "record" pour voir si le type (souhaité : bytes) ?
            #print(type(record))
            # => Résultat 2 : class 'pymarc.record.Record'
                #ISO-8859-9
                #----------------------------
                # notice numéro : 1
                # <class 'pymarc.record.Record'>
                #----------------------------
                # notice numéro : 2
                # <class 'pymarc.record.Record'>
                #----------------------------
                # notice numéro : 3
                # <class 'pymarc.record.Record'>
     
            # commande python3 / help(pymarc.record) pour voir l'aide module pymarc.
            # Si j'ai bien compris la doc de pymarc utiliser : record.as_marc()
     
            # But 3 : Voir les notices
            #print(record.as_marc())
            # Résultat 3 : Les 3 notices sont bien affichées avec encodage bytes (petit b'xxxxxxxxxxxxx' devant)
     
            # But 4 :
            # Affecte la notice dans la variable notice_bytes_encoded / 
            notice_bytes_encoded = record.as_marc()
     
            # But 5 : Affiche le type (<class 'bytes'>) -> OK
            #print(type(notice_bytes_encoded))
     
            # But 6 : Affiche les 3 notices avec échapement des caractères accentués : ex = \x1e' -> OK
            #print(notice_bytes_encoded)
            #print(repr(notice_bytes_encoded))
     
            # But 7 : Affichage les notices dans le bon encodage (utf8) -> !!! KO !!!
            # Utilise la fonction dec5426
            try:
                print((dec5426(notice_bytes_encoded)))
            except:
                print("Erreur But7.")
                pass
     
            # LE BUT FINAL : Affichage des notices avec les caractères accentués bien reconnus.
            #notice_decode = (dec5426(notice_byte_encoded))
            #print("la notice : " + numnotice + "en version decodée est :\033[1;32m" + notice_decode + "\033[0m")
     
    if __name__ == "__main__":
        fichier = (sys.argv[1])
        print("le fichier à analyser est : " + fichier)
        analyse(fichier)

  3. #23
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Citation Envoyé par plnew Voir le message
    Je reviens vers vous, car malgrès mes recherches je ne trouve pas la solution.
    Le "yaz-marcdump" que vous avez déjà sait faire des conversions.

    Si vous voulez "automatiser" la conversion de plusieurs fichiers, il faut écrire un script qui lance ce programme avec les paramètres qui vont bien (si le script est écrit avec Python, le module -standard- subprocess est là pour ça, mais scripter ça avec bash ou autre fonctionnerait aussi bien).

    Une solution se construit avec un savoir-faire maîtrisé par vous (et non par nous).

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

  4. #24
    Nouveau membre du Club
    Homme Profil pro
    Loisir / Plaisir
    Inscrit en
    Février 2012
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Loisir / Plaisir

    Informations forums :
    Inscription : Février 2012
    Messages : 32
    Points : 27
    Points
    27
    Par défaut
    Merci pour votre réponse, mais je ne souhaite justement pas utiliser yaz-marcdump.

    Si je suis sur le forum, c'est justement pour apprendre à faire différemment et seulement avec python.


    C'est peut-être trop compliqué pour moi : d'accord, j'entends aussi votre réponse.

  5. #25
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 378
    Points
    19 378
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    [...]les utilisateurs veulent des outils qui fonctionnent, et ce sans préalable.
    ah!

    #cartmanInside
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  6. #26
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 685
    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 685
    Points : 30 974
    Points
    30 974
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par plnew Voir le message
    Si je suis sur le forum, c'est justement pour apprendre à faire différemment et seulement avec python.
    Le souci c'est que personne sur le forum ne connait ce format. Or pour pouvoir lire un truc il faut savoir comment c'est encodé. On ne peut donc pas te dire comment faire ce qu'on ne ferait pas et qu'on ne sait pas faire.
    Donc on te répond ce que nous ferions dans ce cas là => prendre sur étagère l'outil qui sait le lire.

    Après si tu veux continuer à le faire, alors une des solutions possibles est d'aller récupérer le code source de marcdump, l'analyser pour le traduire en Python. Ou d'aller voir le code source de smc.bibencodings (écrit en Python) et l'explorer en détail. Ou aller télécharger la descripttion du format "marc" pour créer ton propre parser.
    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]

  7. #27
    Nouveau membre du Club
    Homme Profil pro
    Loisir / Plaisir
    Inscrit en
    Février 2012
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Loisir / Plaisir

    Informations forums :
    Inscription : Février 2012
    Messages : 32
    Points : 27
    Points
    27
    Par défaut
    Je ne sais pas la solution que je vais retenir, mais cela va prendre un certain temps

    Merci à tous.

  8. #28
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 378
    Points
    19 378
    Par défaut
    la question, quand on veut travailler en bibliothèque, c'est comment faire avec leur diktat ?
    parce que les gars veulent bien faire, mais ce ne sont pas des informaticiens, et ils ont quand même pondu un format de données, que, manifestement, dans le monde de l'informatique/moderne, personne n'utilise.
    sinon la réponse serait donnée.. la question n'aurait même pas été posée !

    à un moment, il faut lâcher l'affaire, et reconnaître que ce qui aurait pu fonctionner, finalement, n'est pas viable.
    va faire bouger son cul à une vieille vache assise...

    --
    je n'aime pas les bibliothécaires, non plus, ça se voit ?
    à part J.L. Borges !
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  9. #29
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Citation Envoyé par plnew Voir le message
    Merci pour votre réponse, mais je ne souhaite justement pas utiliser yaz-marcdump.

    Si je suis sur le forum, c'est justement pour apprendre à faire différemment et seulement avec python.
    Désolé mais apprendre est une activité personnelle.
    Sur un forum, on pourra vous donner des pistes à explorer ou clarifier des aspects mal compris (ce qui veut dire avoir essayé de comprendre de votre côté avant).

    Déjà quand je lis dans votre message précédent:

    Citation Envoyé par plnew Voir le message
    Je voudrais appliquer la même façon de faire mais avec la notice entière : je suis en echec.
    Ce que vous cherchez à faire est un petit projet qui illustrera ce que vous avez appris dans les tutos. Et la programmation étant une activité de résolution de problèmes, la manière dont vous décrivez le votre montre que vous ne savez pas trop programmer.
    Normal que vous soyez en échec si vous ne maîtrisez pas les bases... passer dans les tutos et faire les exercices proposés est la seule solution.

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

  10. #30
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 949
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 949
    Points : 9 277
    Points
    9 277
    Par défaut
    Hello,
    Citation Envoyé par plnew Voir le message
    J
    Je voudrais appliquer la même façon de faire mais avec la notice entière : je suis en echec.
    C'est normal que tu sois en échec car ce ne sont pas les bons paramètres qui sont passés pour lire du Iso5426 par MarcReader. Il faut utiliser to_unicode=False,force_utf8=True comme ceci par exemple.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
        with open(fichier, 'rb') as fh:
            if charencencoding == "utf-8":
                reader = MARCReader(fh, to_unicode=True, force_utf8=True)
                analyseurunimarc(reader, charencencoding)
            else:
                try:
                    reader = MARCReader(fh, to_unicode=False,force_utf8=True)
                    # lance l'analyseur
                    analyseurunimarc(reader, charencencoding)
                except:
                    print("problème avec le lecteur.")
                    pass
    Le problème c'est chardet qui ne décode pas correctement le type d'encodage et surtout que celui-ci est de type utf-8 (lettres accentuées codées sur 2 octets) et tout cela parce que le deuxième octet d'une lettre accentuée dans le code iso5426 ressemble à de l'ascii ( < 128).
    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  11. #31
    Nouveau membre du Club
    Homme Profil pro
    Loisir / Plaisir
    Inscrit en
    Février 2012
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Loisir / Plaisir

    Informations forums :
    Inscription : Février 2012
    Messages : 32
    Points : 27
    Points
    27
    Par défaut
    Merci pour ton aide jurassic pork

    Effectivement je ne cherchais pas au bon endroit.

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. [VB 2005]encodage fichier texte
    Par Mandarine dans le forum VB.NET
    Réponses: 1
    Dernier message: 03/11/2007, 14h43
  2. Encodage fichier ressources
    Par vdelbart dans le forum Servlets/JSP
    Réponses: 5
    Dernier message: 16/07/2007, 12h17
  3. [java]Encodage fichier XML avec XMLType
    Par adrien.nicolet dans le forum Oracle
    Réponses: 1
    Dernier message: 08/03/2007, 13h09
  4. [encodage fichier texte]
    Par nyko_kliko dans le forum Entrée/Sortie
    Réponses: 1
    Dernier message: 28/07/2006, 16h21
  5. [XSL][C++]encodage fichier xml
    Par luta dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 22/02/2006, 09h45

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