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 API Googletrans [Python 3.X]


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    technicien
    Inscrit en
    Janvier 2010
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : technicien
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2010
    Messages : 73
    Par défaut Problème API Googletrans
    Bonjour à toutes et tous,

    j'essaye de traduire un fichier xml pour un mod(jeu) qui est en russe. j'ai programmé quelques lignes:
    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
     
    import codecs
    from googletrans import Translator
     
     
    handle = open("stable_dialogs_new.xml", encoding="windows-1251")
     
    count = 0
    for line in handle:
        if line.startswith('<string id="'):
            pos = len(line)
            apos = line.find('"' )
            print(line[apos+1:pos-3])
        elif line.startswith('<text>'):
            posT = len(line)
            line = line[6:posT-8]
            print(line)
     
            try:
                trad = Translator()
                t = trad.translate(line, src='ru', dest='fr')
            except:
                t = "\n"
            print(t.line)
            count = count + 1
     
    print("Il y a ", count , "id et text dans le fichier xml")
    et j'ai le message suivant:
    sar_first_dialog_0
    Приветствую тебя, брат! Слава Монолиту!
    Traceback (most recent call last):
    File "C:\py4e\test2-xml.py", line 24, in <module>
    print(t.line)
    AttributeError: 'str' object has no attribute 'line'
    je n'arrive pas à voir d’où vient le problème, j'ai testé le type de line avant de rentrer dans Googletrans et j'obtient du 'str'. j'ai fait une recherche sur ce message d'erreur, mais je ne vois la solution.

    Merci de m'éclairer sur ce problème et pour votre aide

    Bien à vous

    Tremens

  2. #2
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 972
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 972
    Par défaut
    Puisque tu obtiens un chaine (str) alors le message est normal.
    Il est provoqué par la ligne 24 (c'est dans le message d'erreur) où tu as t.line.

    La chaine t ne possède pas de propriété line.

    Au passage, python possède des librairies pour traiter du XML.
    Exemple ici : https://python.doctor/page-xml-python-xpath

  3. #3
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    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 832
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par tremens Voir le message
    je n'arrive pas à voir d’où vient le problème
    Il vient de la ligne indiquée (24). Les messages d'erreur Python sont pourtant assez explicites quoi !!! Parce que franchement, je ne vois pas ce qu'on peut faire de plus pour l'indiquer. Peut-être le mettre en rouge fluo...
    Cette ligne, qui est aussi indiquée dans le message, est la suivante: print(t.line). A la simple lecture, je ne sais pas ce qu'est "t" mais ce que je sais, c'est que c'est un objet qui doit contenir un attribut "line".

    Le message d'erreur continue avec "AttributeError: 'str' object has no attribute 'line' ". Ce qui m'apprend donc que "t" est de type "str" (et en effet un "str" ne contient pas d'attribut "line"). Ok je te l'accorde ça c'est de la connaissance que tu n'es pas obligé d'avoir de suite mais tu ferais un simple dir(str) dans une console Python (après-tout, Python c'est aussi possible en mode direct) et ça te donne la liste de tous les attributs et méthodes de l'objet "str", triés par ordre alphabétique (donc quand après avoir lu "join" tu lis "ljust" ça veut dire que "line" n'y est pas, plus la peine de chercher). Ou alors un encore plus simple "line" in dir(str) te dira ce qu'il en est à ce sujet.

    Ne reste qu'à trouver à quel endroit "t" a pu passer d'un truc éventuellement correct à un str incorrect. En remontant en amont dans le code (parce que oui, fatalement le truc n'a pu se produire qu'avant la ligne 24), je tombe sur deux lignes (lignes 21 et 23, donc pas si extraordinairement loin de la ligne incriminée qu'elles auraient pu t'échapper accidentellement si tu avais vraiment cherché au lieu de te précipiter sur un forum à la première mini-difficulté pour faire chercher les autres à ta place)
    • t = trad.translate(line, src='ru', dest='fr')
    • t = "\n"

    Pour la première je ne sais pas (il faudrait regarder la doc de Translator qui doit expliquer ce que renvoie la fonction translate()) mais en revanche, pour la seconde, tout le monde (toi le premier) peut parfaitement voir que ça c'est du str pur et dur.

    Voilà, sans même tester ton code, juste en lisant le message d'erreur et ce que tu avais écrit ; et en réfléchissant. Ce que tu aurais parfaitement pu faire tout seul.

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    trad = Translator()
    try:
    	t = trad.translate(line, src='ru', dest='fr')
    except:
    	print()
    else:
    	print(t.line)
    Et à mon avis, créer "trad" avant la boucle serait un plus.
    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]

  4. #4
    Membre confirmé
    Homme Profil pro
    technicien
    Inscrit en
    Janvier 2010
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : technicien
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2010
    Messages : 73
    Par défaut
    Merci pour vos retour et source d'informations sur le xml.

    Je sais bien que mon problème ne viens pas de t = "\n".

    Même si je mets print(t.text), ça ne fonctionne pas. (propriété de t)

    La phrase qui rentre est bien en str, en revanche la sortie quid. j'ai essayé avec une petite phrase directement et j'ai une erreur.

    Je vais fouiller plus en détail cet api googletrans.

    Je reviendrai vers avec la solution...

  5. #5
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    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 832
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par tremens Voir le message
    Je sais bien que mon problème ne viens pas de t = "\n".
    Pourtant, de mon point de vue, c'est là, c'est le seul endroit où il y a un str. De toute façon afficher t.line après avoir potentiellement traité l'instruction t="\n" est au mieux une probable source de bug.

    Citation Envoyé par tremens Voir le message
    La phrase qui rentre est bien en str, en revanche la sortie quid. j'ai essayé avec une petite phrase directement et j'ai une erreur.
    Et tu as essayé print(type(t)) pour voir "quoi" est t? C'est quand-même la solution de base. Ensuite un print("text" in dir(t)) suivi d'un print("line" in dir(t)) te diront directement ce que tu veux savoir (tout ça bien évidemment dans ce qui correspond au "else" de mon dernier exemple parce que dans le "except" ça servira évidemment à rien, là on sait ce qu'est "t").

    Après on peut aller un peu plus loin. Déjà remplacer except par except Exception as e puis print(e) te dira pourquoi trad.translate() ne fonctionne pas.
    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]

  6. #6
    Membre confirmé
    Homme Profil pro
    technicien
    Inscrit en
    Janvier 2010
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : technicien
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2010
    Messages : 73
    Par défaut
    Merci pour ton aide précieuse.

    Après recherche, il apparait que je n'utilise pas l'API officielle mais celle qui dérive d'AJAX, enfin c'est pas très claire pour moi.

    si j'ai bien compris je crois que j'ai un problème de formatage de mon entrée str dans l'API.

    J'ai testé tes dernières recommandations, mais comme il ne sort rien de t, je n'ai pas d'info.

    mon dernier test
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    from googletrans import Translator
     
    translator = Translator()
     
    text = 'Слава Монолиту! Приветствую нашего нового брата!'
     
    result = translator.translate(text, src='ru', dest='fr')
     
    print(type(result))
    print("text" in dir(result))
    et la réponse console:
    C:\py4e>test3-xml.py
    Traceback (most recent call last):
    File "C:\py4e\test3-xml.py", line 7, in <module>
    result = translator.translate(text, src='ru', dest='fr')
    File "C:\Users\Mou\AppData\Local\Programs\Python\Python310\lib\site-packages\googletrans\client.py", line 182, in translate
    data = self._translate(text, dest, src, kwargs)
    File "C:\Users\Mou\AppData\Local\Programs\Python\Python310\lib\site-packages\googletrans\client.py", line 78, in _translate
    token = self.token_acquirer.do(text)
    File "C:\Users\Mou\AppData\Local\Programs\Python\Python310\lib\site-packages\googletrans\gtoken.py", line 194, in do
    self._update()
    File "C:\Users\Mou\AppData\Local\Programs\Python\Python310\lib\site-packages\googletrans\gtoken.py", line 62, in _update
    code = self.RE_TKK.search(r.text).group(1).replace('var ', '')
    AttributeError: 'NoneType' object has no attribute 'group'
    ,
    Mais quid de la façon de formater mon entrée, quel module lié à googletrans je dois installer?
    j'ai lu dans mes recherches, l'api rest! Elle formate la requête au format JSON... je crois.

    Je continue de chercher, et merci encore

    Tremens

  7. #7
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    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 832
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par tremens Voir le message
    J'ai testé tes dernières recommandations, mais comme il ne sort rien de t, je n'ai pas d'info.
    Si, il ya des infos !!
    L'erreur se situe ligne 7 result = translator.translate(text, src='ru', dest='fr') (évidemment c'est l'action principale de ton test). Mais cette erreur hérite des diverses erreurs survenues dans le module googletrans (où tu n'as pas la main) qui remontent au final dans ton code.
    De là, on peut formuler deux hypothèses
    1. ta façon d'appeler translator.translate() ne correspond pas à celle qu'il faut employer (et là, seule la doc poura te le dire)
    2. le module est foireux

    Je viens de recopier ton dernier test, pareil pour moi. Mais pire, je vais sur leur site (je pense qu'il s'agit de celui sur pypi) et je tape leur propre exemple...
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    from googletrans import Translator
    translator = Translator()
    translator.translate('안녕하세요.')
    translator.translate('안녕하세요.', dest='ja')
    translator.translate('veritas lux mea', src='la')
    ... et là, même erreur !!!
    A partir de là, on ne peut que partir sur l'hypothèse que ce truc est foireux...

    Pour ton histoire d'ajax, c'est pas ça. Ce que la page dit (https://pypi.org/project/googletrans), c'est que ce module fait appel à une API de google pour traduire. En résumé, le module ne fait qu'appeler des outils qui sont chez google

    Citation Envoyé par tremens Voir le message
    Mais quid de la façon de formater mon entrée, quel module lié à googletrans je dois installer?
    Yapas. Après, si ton truc à traduire n'est pas très long tu peux aller sur DeepL (je le préfère à celui de google) tenter le copier/coller.

    PS: on a quitté le domaine du souci originel, à savoir pourquoi print(t.line) ne marche pas (réponse, parce que translate() ne marche pas donc tu rentres dans le "except" dans lequel "t" est une string et ne contient pas d'attribut "line"). Il est intéressant de noter que si tu avais écrit ton code correctement (comme mon exemple), ça n'aurait pas mieux fait fonctionner translate() mais n'ayant pas d'erreur d'exécution tout en entrant à chaque fois dans le "except", tu aurais eu un document entièrement vide à la sortie
    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]

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

Discussions similaires

  1. Problème api Windows
    Par abdennour bouaicha dans le forum Windows
    Réponses: 4
    Dernier message: 06/05/2009, 12h49
  2. Problème API JAVAX.COMM
    Par dude78 dans le forum API standards et tierces
    Réponses: 3
    Dernier message: 10/02/2009, 09h33
  3. Problème API snmp
    Par kuribo dans le forum API, COM et SDKs
    Réponses: 0
    Dernier message: 02/04/2008, 09h45
  4. [VBA-E] Problème API FindWindowA
    Par stos dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 31/01/2007, 16h36
  5. [Win2000]Problème API, DLL ou... ?
    Par izacalva dans le forum Windows Serveur
    Réponses: 4
    Dernier message: 24/06/2006, 21h10

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