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

Réseau/Web Python Discussion :

Python + ftplib/ftputil : date ok mais pas l'heure


Sujet :

Réseau/Web Python

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2013
    Messages : 29
    Points : 14
    Points
    14
    Par défaut Python + ftplib/ftputil : date ok mais pas l'heure
    Bonjour,

    Je souhaite faire un script Python pour effacer les fichiers d'un FTP datant de plus de xx heures. Ce script serait appelé par une machine (linux ou windows) se connectant au FTP.

    Problème: je souhaite connaitre la date et l'heure de dernière modification de chaque fichier et je n'obtiens que la date: l'heure est à zero (alors que bien sûr ce n'est pas le cas).

    Si je fais un simple ftplib.dir() j'obtiens l'info (en la filtrant), mais je ne suis pas sûr que le formatage soit systématiquement identique d'un ftp à l'autre.
    J'utilise ftputil car dans ftplib je ne suis pas parvenu à faire fonctionner un f.sendcmd("MDTM",liste) (f étant un objet ftp de ftplib). J'ai un retour "unrecognized command".

    Avez-vous une idée? Idéalement, je souhaite privilégier ftplib (car rien de nouveau à installer).

    Voici mon code actuel (uniquement ce qui concerne l'acces FTP, pour ne pas encombrer). Merci pour votre aide

    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
     
    # -*- coding: utf-8 -*-
    import os,time,ftplib, ftputil
     
    liste=[]
    class ftpparams:
        host=""
        user=""
        passwd=""
        path=""
     
    if __name__ == '__main__':
     
        # récupération de l'adresse FTP, login, mot de passe, répertoire base
        f=open("ftpcredentials.txt","r")
        ftpparams.host=f.readline().rstrip()
        ftpparams.user=f.readline().rstrip()
        ftpparams.passwd=f.readline().rstrip()
        ftpparams.path=f.readline().rstrip()
        f.close()
     
        #connexion au FTP
        with ftputil.FTPHost(ftpparams.host,ftpparams.user,ftpparams.passwd) as ftp_host:
            liste=ftp_host.listdir(ftp_host.curdir)
            for i in liste:
                print i+" ",
                a=ftp_host.lstat(i)
                print a
                b=ftp_host.path.getmtime(i)
                print b
                t=time.localtime(a.st_mtime)
                print time.strftime("%Y%m%d%H%M%S",t)

  2. #2
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    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 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Voilà ce que j'utilise:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    def datemodifftp(ftp, fichier):
        """retourne la date et heure de la dernière modification du fichier
           en format type ISO: "2015-03-15 10:28:06"
        """
        date = ftp.sendcmd('MDTM ' + fichier)[4:]
        return datetime.strptime(date, "%Y%m%d%H%M%S")
    La chaine renvoyée est telle que le tri alphabétique est identique au tri chronologique.

    Un des avantages de ftplib: on peut utiliser directement le protocole ftp, ici MDTM (https://fr.wikipedia.org/wiki/Liste_des_commandes_ftp)
    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

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2013
    Messages : 29
    Points : 14
    Points
    14
    Par défaut
    Merci beaucoup, c'est un grand pas en avant pour moi

    Je ne sais pas pourquoi subitement cette commande MDTM fonctionne... (j'obtenais systématiquement un "unrecognized command").
    Peux-tu me dire si cette méthode est robuste d'un ftp à l'autre? (à priori oui, mais je préfère m'en assurer).
    C'est quoi ce "213 " avant la date? ;-)

    Enfin, à part en parsant un LIST sur les attributs de fichiers, connais-tu un moyen de récupérer la liste des fichiers uniquement (pas des sous-directory, incluant "." et "..") ?
    Je n'ai pas de probleme à faire ce parsing, mais j'ai peur que ca rende mon code spécifique à certains serveurs ftp uniquement. Je pense en particulier à l'index de colonne où je retrouve le nom de fichier, qui pourrait varier (46 dans mon cas) )
    Par ailleurs, si je fais un ligne.split(' ') (où ligne est une ligne retournée par ftp.dir() ) j'obtiens des chaines vides pour chaque ' ' rencontré, donc je dois vraiment prendre l'indice de colonne...

  4. #4
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    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 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Citation Envoyé par Jijil Voir le message
    Je ne sais pas pourquoi subitement cette commande MDTM fonctionne... (j'obtenais systématiquement un "unrecognized command").
    Regarde bien la syntaxe de ta commande avec la mienne: tu as mis une virgule alors qu'il faut envoyer une chaine complète.

    Citation Envoyé par Jijil Voir le message
    Peux-tu me dire si cette méthode est robuste d'un ftp à l'autre? (à priori oui, mais je préfère m'en assurer).
    Ça devrait marcher avec tous les serveurs ftp qui sont conformes au protocole ftp! Mais il y a toujours le risque d'un serveur qui a une configuration anormale.

    Citation Envoyé par Jijil Voir le message
    C'est quoi ce "213 " avant la date? ;-)
    Il s'agit du code de réponse du serveur ftp: https://fr.wikipedia.org/wiki/Liste_des_codes_des_r%C3%A9ponses_d'un_serveur_FTP.

    Pour le reste de tes questions, je n'ai plus le temps maintenant. Peut-être ce soir, à moins que quelqu'un d'autre réponde.
    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

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2013
    Messages : 29
    Points : 14
    Points
    14
    Par défaut
    Merci beaucoup pour ta réponse et... ta lecture attentive (tu avais raison)
    Au passage, une mini correction: dans ton code, c'est plutôt time.strptime() que datetime.strptime()
    (ça arrive même aux meilleurs )

    Pas de souci pour la suite, c'est moins urgent. J'ai déjà implémenté une solution à base de "LIST" qui fonctionne. Mais je me demande juste ce que ça vaut côté "robustesse" face à la multitude de serveurs ftp existants.

    Merci encore

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2013
    Messages : 29
    Points : 14
    Points
    14
    Par défaut
    Nouveau souci: le répertoire réel fraichement testé contient pour l'instant 14000 fichiers. Un LIST via Python est interminable (3-4minutes) (pour être précis: ftp.dir(listedefichiers.append) ). Même en local sur la machine qui héberge le ftp (en se connectant donc sur 127.0.0.1).

    Connaitriez-vous une solution plus rapide? (genre en connexion binaire plutôt qu'ASCII peut-être?) Je cherche à obtenir les noms de fichiers et leur date/heure de dernière modification.

    Merci

    PS: Je sais que je pourrais tout gérer par l'OS plutôt que par FTP, mais à terme c'est bien sur un ftp que ces images vont aller. Ce sont des images d'un système de vidéosurveillance (en très résumé) avec plusieurs cameras IP.

  7. #7
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    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 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par Jijil Voir le message
    dans ton code, c'est plutôt time.strptime() que datetime.strptime()
    (ça arrive même aux meilleurs )
    Et oui, il m'arrive de faire des erreurs, mais pas là... J'aurais peut-être dû ajouter la ligne d'importation:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    from datetime import datetime
    Pour la liste des fichiers, voilà ce que j'utilise:

    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 listerepftp(ftp):
        """Renvoie la liste des répertoires et des fichiers du répertoire courant
           sans les sous-répertoires '.' ni '..' quand ils sont renvoyés
        """
        lignes, nomsfic, nomsrep = [], [], []
        ftp.dir(lignes.append)
        for ligne in lignes:
            liste = ligne.split()
            if liste[0][0]=='d':
                if liste[-1] not in ['.', '..']:
                    nomsrep.append(liste[-1])
            else:
                nomsfic.append(liste[-1])
        return nomsrep, nomsfic
    Ça ne donne que les noms des sous-répertoires et des fichiers du répertoire courant.

    Les 2 répertoires indésirables '.' et '..', quand ils sont renvoyés, sont neutralisés avec le test: if liste[-1] not in ['.', '..'].

    On voit bien la logique: après un split(), le nom est le dernier de la ligne (liste[-1]), et si le 1er caractère de la ligne est 'd', c'est un sous-répertoire.

    Jusqu'à présent, ça m'a toujours donné de bons résultats, mais bien sûr, je n'ai pas l'occasion d'essayer sur de nombreux serveurs différents!
    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

  8. #8
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    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 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par Jijil Voir le message
    Un LIST via Python est interminable (3-4minutes) (pour être précis: ftp.dir(listedefichiers.append) )
    Un ftp.dir(listedefichiers.append) est long parce qu'il attend d'avoir les 14000 fichiers pour continuer.

    Je ne suis pas sûr qu'on puisse aller plus vite (débit de la ligne ftp), mais on peut faire patienter l'utilisateur en affichant au fur et à mesure, en même temps qu'on ajoute dans la liste:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class Listeftp(object):
     
        def __init__(self, ftp):
            self.ftp = ftp
            self.listenoms = []
     
        def printx(self, ligne):
            print(ligne)
            self.listenoms.append(ligne)
     
        def liste(self):
            self.ftp.dir(self.printx)
    Utilisation toute simple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        listeftp = Listeftp(ftp)
        listeftp.liste()
    Et la liste complète des lignes se trouve dans listeftp.listenoms

    Bien sûr, tant pour l'affichage que pour l'ajout à la liste, on peut filtrer pour n'avoir que les infos utiles!
    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

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2013
    Messages : 29
    Points : 14
    Points
    14
    Par défaut
    Merci très tardif pour ta réponse. En effet, je n'ai pas trouvé mieux non plus de mon côté... Ta solution me semble un bon compromis... je m'y mets
    Merci encore!

Discussions similaires

  1. Variable Date n'affiche pas l'heure dans la JSP
    Par TheEtudiant dans le forum Servlets/JSP
    Réponses: 10
    Dernier message: 02/07/2015, 20h46
  2. Réponses: 4
    Dernier message: 02/08/2010, 11h20
  3. Réponses: 2
    Dernier message: 10/02/2010, 14h50
  4. Repérer deux fichiers identiques mais pas avec les mêmes dates
    Par rambc dans le forum Général Python
    Réponses: 14
    Dernier message: 17/03/2009, 03h13
  5. [PIL] appli tournant en python mais pas en exe
    Par pfeuh dans le forum Py2exe
    Réponses: 11
    Dernier message: 09/03/2006, 18h56

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