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

PyQt Python Discussion :

exception avec datetime.strptime()


Sujet :

PyQt Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 323
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 323
    Par défaut exception avec datetime.strptime()
    bonjour

    Avant un download, je dois récupérer un entête http `expires` qui est de la forme: Wed, 24 Nov 2021 21:36:46 GMT


    En tout debut de mon script, cette fonction fonctionne, mais plus dans le corps pyQt5 ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    d = datetime.datetime.strptime("Wed, 24 Nov 2021 21:36:46 GMT","%a, %d %b %Y %H:%M:%S %Z")
    Mais dans l'application Qt5 (et dans un thread Qt) plus moyen: strptime retourne une exception format invalide ?

    J'avais cru trouver un contournement (qui ne me satisfaisait pas):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    old_locale = locale.getlocale(locale.LC_ALL)
    with request.urlopen(req) as response:
        expire = datetime.datetime.strptime(response.headers["Expires"],"%a, %d %b %Y %H:%M:%S %Z")
    locale.setlocale(locale.LC_ALL, old_locale)
    fonctionne pour moi en fr mais pas pour d'autres utilisateurs avec une locale différente de la mienne, un retour est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    File "/usr/lib/python3.9/locale.py", line 592, in getlocale
        raise TypeError('category LC_ALL is not supported')

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    Par défaut
    Salut,

    L'horodatage des en-têtes HTTP/MAIL/... et autres protocoles Internets se fait avec une chaîne de caractères indépendante de la localisation.

    On ne va pas pouvoir utiliser datetime (qui dépend du locale), d'autant que locale.setlocale n'est pas thread-safe.

    Vu que le format de l'horodatage Internet est "fixe", on peut coder une fonction qui sera indépendante de datetime (et du locale).
    On peut aussi se dire que depuis le temps qu'existe ce format, d'autres utilisateurs ont rencontré le même problème et ça doit en causer sur Internet.

    On peut aussi partir sur l'hypothèse que ce genre de code étant récurrent, il doit bien exister dans les bibliothèques Python une fonction pour çà.
    Vu le nombre de bibliothèques standards, ce serait quantité de neurones à vouloir mémoriser tout ce qu'on y trouve. Heureusement, il y a des moteurs de recherche et si on y entre les mots clefs: "python http datetime headers", çà sort tout ce qu'on veut assez vite.

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

  3. #3
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 323
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 323
    Par défaut
    Oui, j'ai écrit ma propre fonction, mais pour moi c'est plus un contournement sans bien comprendre le réel problème

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    def convert_header_date(header: str) -> datetime.datetime:
        """ http header `Wed, 24 Nov 2021 21:36:46 GMT` to datetime """
        months = {
            'Jan': "01", 'Feb': "02", 'Mar': "03", 'Apr': "04",
            'May': "05", 'Jun': "06", 'Jul': "07", 'Aug': "08",
            'Sep': "09", 'Oct': "10", 'Nov': "11", 'Dec': "12"
        }
        headers = header.split(' ')[1:]
        try:
            headers[1] = months[headers[1]]
            header = ' '.join(headers)
        except KeyError:
            header = '01 01 1970 00:00:00 GMT'
        return datetime.datetime.(header,"%d %m %Y %H:%M:%S %Z")
    Je me demandais surtout pourquoi strptime() fonctionne très bien dans le même script si placé avant l'appel de QApplication
    getlocale() me retourne ('fr_FR', 'UTF-8') déjà avant d'entrer dans Qt5 et pas de problème
    ps: suis sous linux/plasma

    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
     
        ...
        print(locale.getlocale())  # retourne ('fr_FR', 'UTF-8')
     
        # passe très bien
        datetime.datetime.strptime("Wed, 24 Nov 2021 21:36:46 GMT","%a, %d %b %Y %H:%M:%S %Z")
     
        app = QtWidgets.QApplication(sys.argv)
        win = WinMain()
        win.show()
        datetime.datetime.strptime("Wed, 24 Nov 2021 21:36:46 GMT","%a, %d %b %Y %H:%M:%S %Z") 
        #  opps: ValueError: time data 'Wed, 24 Nov 2021 21:36:46 GMT' does not match format '%a, %d %b %Y %H:%M:%S %Z'
     
        # meme datetime.datetime.strptime("25 Nov 2021 21:36:46 GMT","%d %b %Y %H:%M:%S %Z") plante ? pourtant le même que fr
        sys.exit(app.exec_())

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    Par défaut
    Citation Envoyé par papajoker Voir le message
    Je me demandais surtout pourquoi strptime() fonctionne très bien dans le même script si placé avant l'appel de QApplication
    Le démarrage de Qt change la locale, mais comme vous n'êtes pas supposé en dépendre pour ce genre d'horodatage...

    - 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. Réponses: 2
    Dernier message: 05/01/2006, 10h43
  2. [vb.net]Gestion des exceptions avec les web services
    Par mvr dans le forum Windows Forms
    Réponses: 2
    Dernier message: 05/12/2005, 22h41
  3. Réponses: 2
    Dernier message: 14/02/2005, 14h26
  4. Réponses: 3
    Dernier message: 09/11/2004, 14h43
  5. INSO Filter : "USER-defined exception" avec ctx_do
    Par Wiztiti dans le forum Oracle
    Réponses: 2
    Dernier message: 01/06/2004, 16h14

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