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 :

Convertir une date anglaise avec python


Sujet :

Python

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 17
    Points : 9
    Points
    9
    Par défaut Convertir une date anglaise avec python
    Bonjour,

    Avec Python j’essaie de faire un script pour écrire dans un fichier texte la liste des fichiers d'un répertoire avec leur taille et les dates de création, modification et accès.

    Pour la date de création, j'utilise la ligne de code suivante :
    creation=time.ctime(os.path.getctime(glob.glob(cible)[i]))

    mais cela me renvoie la date dans ce format : Thu May 2 19:23:43 2013 (date anglais).

    Y a t il un moyen rapide et simple pour convertir ce résultat en 2013/05/02 19:23:43 (date française) ?

    Merci

  2. #2
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2013
    Messages
    388
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2013
    Messages : 388
    Points : 692
    Points
    692
    Par défaut
    Salut,
    Il faut convertir la chaine de caractères retournée par ctime en une struct_time (méthode strptime).
    Il est ensuite possible d'imposer un format lors de l'écriture avec la méthode strftime.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    import os, time
    pwd = os.getcwd()
    for fichier in os.listdir(pwd):
        dt = os.path.getctime(fichier)
        t_str = time.ctime(dt)
        t_struct = time.strptime( t_str, "%a %b %d %H:%M:%S %Y")
        t_fmt = time.strftime("%Y/%m/%d %H:%M:%S", t_struct)
        print( t_str, t_fmt, sep=' -> ' )

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 17
    Points : 9
    Points
    9
    Par défaut
    Merci beaucoup.
    Cela marche, et en lus j'ai compris

  4. #4
    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 __dardanos__ Voir le message
    Salut,
    Il faut convertir la chaine de caractères retournée par ctime en une struct_time (méthode strptime).
    Il est ensuite possible d'imposer un format lors de l'écriture avec la méthode strftime.
    dt étant un temps en secondes, pour le transformer en t_struct, il suffit de lui appliquer time.localtime

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    import os, time
    pwd = os.getcwd()
    for fichier in os.listdir(pwd):
        dt = os.path.getctime(fichier)
        t_str = time.ctime(dt)
        t_fmt = time.strftime("%Y/%m/%d %H:%M:%S", time.localtime(dt))
        print( t_str, t_fmt, sep=' -> ' )
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 461
    Points : 9 248
    Points
    9 248
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    En fait, le format recherché est proche du format international ISO8601 (https://fr.wikipedia.org/wiki/ISO_8601).

    Python a une fonction pour reproduire une telle date dans le module datetime:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    from datetime import datetime
    print datetime.fromtimestamp(os.path.getctime(glob.glob(cible)[i])).isoformat(' ').replace('-', '/')[:19]
    2013/04/18 06:24:46
    L'argument de isoformat permet de définir le caractère qui sépare la date de l'heure ('T' par défaut)

    .replace() permet de remplacer '-' (séparateur de la date par défaut) par '/'

    [:19] permet de neutraliser les microsecondes.
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 17
    Points : 9
    Points
    9
    Par défaut
    Bonjour,
    Avec votre aide, je suis arrivé au bout de mon premier script en Python.
    Pourtant, il contient une partie dont je ne comprends pas le fonctionnement.
    Dans un premier temps, j'avais mis en début de scrip t:
    fichier= open("E:/Python/ListingFichiers5.txt","a")
    suivit des lignes de code nécessaires à la recherche des données à écrire dans mon .txt
    puis, en fin de recherche :
    fichier.writelines(ecrire)
    et après la fin de la boucle (while i) qui recherchait ces données
    fichier.close()
    Mais cela ne fonctionnait pas.
    J'ai du déplacer les instructions d'ouverture, écriture et clôture du .txt à la fin du while (avant incrémentation du i) pour que le script me donne le résultat voulu.
    Est-ce normal ?
    On doit bien pouvoir ouvrir un fichier en écriture en début de script (une seule fois), écrire à tous niveaux du script et fermer en fin de script?
    Une explication me rendrait encore plus redevable envers vous

    Pour info. l'intégralité de mon code :
    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
    import os, glob, time, re
    # Definir le répertoire racine (à explorer et qui contiendra le fichier de sortie)
    cible="E:\Python"
    # Pour chaque repertoire, sous repertoires et fichiers dans le repertoire racine
    for repertoires, sousrepertoires, fichiers  in os.walk(cible):
    # Modifier le nom de la cible
        cible=repertoires +"\*"
        i=0
        ecrire=""
    # Tant que le repertoire racine n'a pas été entièrement exploré
        while i<len(glob.glob(cible)):
    # Si la cible est un fichier
            if os.path.isfile(glob.glob(cible)[i]):
    # Decomposer en chemin et fichier
               repertoire,fichier = os.path.split(glob.glob(cible)[i])
    # Calculer la taille du fichier
               taille=os.path.getsize(glob.glob(cible)[i])
    # Calculer la date de création du fichier, puis la formater en date françaises
               creation=time.ctime(os.path.getctime(glob.glob(cible)[i]))
               creation=time.strptime(creation, "%a %b %d %H:%M:%S %Y")
               creation=time.strftime("%Y/%m/%d %H:%M:%S",creation)
    # Calculer la date de dernière modification du fichier, puis la formater en date françaises
               modification=time.ctime(os.path.getmtime(glob.glob(cible)[i]))
               modification=time.strptime(modification, "%a %b %d %H:%M:%S %Y")
               modification=time.strftime("%Y/%m/%d %H:%M:%S",modification)
    # Calculer la date du dernier acces au fichier, puis la formater en date françaises
               deracces=time.ctime(os.path.getatime(glob.glob(cible)[i]))
               deracces=time.strptime(deracces, "%a %b %d %H:%M:%S %Y")
               deracces=time.strftime("%Y/%m/%d %H:%M:%S",deracces)
    # Ecrire les résultats (séparés par un tabulateur) dans un fichier texte
               ecrire=str(repertoire)+chr(9)+str(fichier)+chr(9)+str(taille)+chr(9)+str(creation)+chr(9)+str(modification)+chr(9)+str(deracces)+chr(13)
               fichier= open("E:/Python/ListingFichiers5.txt","a")
               fichier.writelines(ecrire)
               fichier.close()
    # Incrémenter i
            i=i+1
     
    #Annoncer la fin du traitement
    print("Traitements terminés")

  7. #7
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2013
    Messages
    388
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2013
    Messages : 388
    Points : 692
    Points
    692
    Par défaut
    Tout simplement parce que l'on a à la ligne 15 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
               repertoire,fichier = os.path.split(glob.glob(cible)[i])
    Si l'objet fichier est ouvert avant la boucle de cette façon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
               fichier= open("E:/Python/ListingFichiers5.txt","a")
    sa référence est perdue.

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 17
    Points : 9
    Points
    9
    Par défaut
    Envident mon cher W.
    J'espère qu'avec le temps je ne me mélangerai plus les pinceaux avec les noms de variables
    Merci
    Si vous avez des commentaires sur mon code, elles sont les bienvenue

  9. #9
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2013
    Messages
    388
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2013
    Messages : 388
    Points : 692
    Points
    692
    Par défaut
    L'utilisation de la fonction listdirectory2 présentée dans la FAQ permettrait d'avoir une boucle plus propre.
    Le programme fait trois fois la même chose pour déterminer creation, modification et deracces. Création d'une fonction ?

  10. #10
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 17
    Points : 9
    Points
    9
    Par défaut
    Bonjour,
    Merci pour votre réponse.
    Avec le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    # -*- coding: latin-1 -*-
    import os.path, re
    cible="E:\Python"
    def listdirectory2(path): 
        fichier=[] 
        for root, dirs, files in os.walk(path): 
            for i in files: 
                fichier.append(os.path.join(root, i)) 
        return fichier
     
    print(listdirectory2(cible))
    J'obtiens : ['E:\\Python\\Boite01.py', 'E:\\Python\\Boite01.ui', 'E:\\Python\\Boite01_ui.py' ....
    Qui ne me convient pas.
    Et si je remplace la dernière ligne par : print(listdirectory2(cible).replace("\\","\")) ; Python me renvoie le message : EOL while scanning string literal
    J'ai essayé d'autres méthodes pour replace (""",chr(92),r) ; sans succès.

    J'ai refais le script d'origine (celui qui marche) en intégrant un fonction de conversion pour les dates.
    C'est évidemment plus élégant, mais curieusement cela fait 2 lignes de code supplémentaires.

    Enfin, si ce n'est pas trop abuser de votre temps, qu'elle est la démarche globale pour faire de la fonction un fichier exécutable dans n'importe quel script ?

  11. #11
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 461
    Points : 9 248
    Points
    9 248
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    J'ai peut-être un code qui pourrait te convenir (Python 3.2), ou au moins t'inspirer:

    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
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    # Python 3.2
     
    import os, sys, traceback
    from fnmatch import fnmatch
    from datetime import datetime
     
    def listerepfic(repertoire, selection="*", callback=None):
        """envoie dans callback les sous-répertoires, ainsi que 
           les fichiers correspondant à la sélection
        """
        def erreur(a):
            if callback != None:
                callback(str(sys.exc_info()[1]).replace(r'\\', '\\' ) + '\n')
     
        tailletotale = 0 # somme des tailles de tous les fichiers sélectionnés
        nbfic = 0 # nombre total de fichiers sélectionnés
     
        for rep, _, listefichiers in os.walk(repertoire, onerror=erreur):
            for fichier in listefichiers:
                if fnmatch(fichier, selection):
                    chemin = os.path.join(rep, fichier)
                    taille = os.path.getsize(chemin)
                    creation = datetime.fromtimestamp(os.path.getctime(chemin)).isoformat('_').replace('-', '/')[:19]
                    modification = datetime.fromtimestamp(os.path.getmtime(chemin)).isoformat('_').replace('-', '/')[:19]
                    deracces = datetime.fromtimestamp(os.path.getatime(chemin)).isoformat('_').replace('-', '/')[:19]
                    if callback!=None:
                        callback(chr(9).join([rep, fichier, str(taille), creation, modification, deracces])+'\n')
     
                    nbfic += 1
                    tailletotale += taille
     
        return nbfic, int(tailletotale)
    Voilà comment on l'utilise:

    1- pour remplir le fichier "ListingFichiers5.txt":

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    repertoire = r"C:\Python32\Lib\lib2to3"
    selection = "*.py"
    fichierlog = "ListingFichiers5.txt"
     
    with open(fichierlog, 'w') as fw:
        nbfic, tailletotale = listerepfic(repertoire, selection, fw.write)
    print(nbfic, tailletotale)
    2- pour seulement afficher le résultat en console, on utilise sys.stdout comme callback (il faudrait peut-être ajouter une correction d'encodage selon sys.stdout.encoding):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    nbfic, tailletotale = listerepfic(repertoire, selection, sys.stdout.write)
    print(nbfic, tailletotale)
    Bien entendu, si on laisse callback=None, la fonction lit bien l'arborescence, mais ne dit rien, à part de restituer le nombre de fichiers correspondant à la sélection, et leur taille totale.

    Exemple de sortie:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ...
    C:\Python32\Lib\lib2to3	pygram.py	1154	2011/03/08_09:41:38	2011/03/08_09:41:38	2013/05/08_07:45:57
    C:\Python32\Lib\lib2to3	pytree.py	29926	2011/05/03_23:48:38	2011/05/03_23:48:38	2013/05/08_07:45:57
    C:\Python32\Lib\lib2to3	refactor.py	28227	2011/05/03_23:48:38	2011/05/03_23:48:38	2013/05/08_07:45:57
    C:\Python32\Lib\lib2to3	__init__.py	8	2011/03/08_09:41:38	2011/03/08_09:41:38	2013/05/08_07:45:56
    C:\Python32\Lib\lib2to3\fixes	fix_apply.py	1960	2011/03/08_09:41:38	2011/03/08_09:41:38	2013/05/08_07:45:56
    C:\Python32\Lib\lib2to3\fixes	fix_basestring.py	334	2011/03/08_09:41:38	2011/03/08_09:41:38	2013/05/08_07:45:56
    C:\Python32\Lib\lib2to3\fixes	fix_buffer.py	612	2011/03/08_09:41:38	2011/03/08_09:41:38	2013/05/08_07:45:56
    ...
    96 632214
    En cas d'impossibilité de rentrer dans un répertoire, os.walk est silencieux, ce qui ne convient pas forcément. J'ai donc prévu dans ce cas d'ajouter une ligne d'erreur dans la liste. Si on ne la veut pas, il suffit d'ajouter aux arguments d'os.walk l'argument: "onerror=None".

    A ta disposition pour commenter d'autres aspects si tu le souhaites.
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  12. #12
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 17
    Points : 9
    Points
    9
    Par défaut
    Bonjour,
    Quelle rapidité !
    Ton script marche et correspond à mon attente (sous réserve de modifier repertoire = r"C:\Python32\Lib\lib2to3" par repertoire = r"E:\Python" )
    Petite curiosité : mon script crée un fichier de 141 enregistrements et le tien un fichier de 93 enregistrements.

    En tous cas merci beaucoup ; même s''il va me falloir tout le weekend (au moins) pour comprendre les différences entre les 2 scripts (notion de callback, pourquoi .replace(r'\\', '\\' ) + '\n') ne bug pas, le problème des dates anglaises devient plus simple à gérer, etc ...)

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

Discussions similaires

  1. [MySQL] Convertir une date Anglaise MSQL en date Française
    Par bertrandg17 dans le forum PHP & Base de données
    Réponses: 12
    Dernier message: 07/05/2014, 10h36
  2. convertir une date anglaise en francaise ???
    Par toyyo dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 09/08/2005, 15h56
  3. []Comment convertir une date GMT en date vb ?
    Par Invité dans le forum VB 6 et antérieur
    Réponses: 10
    Dernier message: 11/08/2004, 16h01
  4. Convertir une date au format excel en datetime SQL server
    Par ALLB dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 20/07/2004, 11h28
  5. Convertir une date en type string
    Par ziboux dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 29/10/2003, 10h52

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