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 :

Boucle avec comme condition une comparaison de nom de fichiers


Sujet :

Python

  1. #1
    Membre du Club
    Inscrit en
    Mai 2011
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Mai 2011
    Messages : 72
    Points : 49
    Points
    49
    Par défaut Boucle avec comme condition une comparaison de nom de fichiers
    Bonjour à tous !

    Je suis sur un gros projet en ce moment me faisant manipuler des milliers de fichers (7500 exactement).
    J'ai deux ensembles de fichier, un venant d'un radar (avec 3250 fichiers), et l'autre provenant d'un modèle de simulation (3250 fichiers).

    Chaque ensemble de fichiers est ainsi :

    Radar201611200.txt (pour : 2016 novembre 20eme jour et 0 pour minuit)
    Radar201611201.txt (pour : 2016 novembre 20eme jour et 1 pour une heure du mat etc)
    Radar201611202.txt
    Radar201611203.txt
    Radar201611204.txt
    ...

    et

    Simu_2016111920_sup.txt (pour : 2016 novembre 19eme jour et 20h UTC soit 24h local comme pour le radar)
    Simu_2016111921_sup.txt
    Simu_2016111922_sup.txt
    Simu_2016111923_sup.txt
    Simu_2016111924_sup.txt

    On remarque ici que le deuxieme ensemble de fichiers a un décalage horaire de 4h (différence UTC / heure locale), mais aussi qu'ils sont décalé comme suit :

    Radar : 16 17 18 19 20 21 22 23 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15
    Simul : 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35

    Le rouge correspond au 19 novembre, le vert au 20 novembre. Les données de la simulation quant à eux vont de 12 à 35 heures (même si le nom du fichier est daté du 19 novembre, il recouvre une partie du 20 novembre des données du radar) . Bref c'est simple n'est-ce pas ?

    Donc Radar201611200.txt doit etre comparé avec Simu_2016111920_sup.txt
    Radar201611201.txt doit etre comparé avec Simu_2016111921_sup.txt
    etc

    Première difficulté pour moi :
    - Comment faire une boucle en comparant deux noms de fichiers ? imaginons :
    if toto1.txt et mimi1.txt exists then (puis mes calculs suivent)

    - Comment faire pour que si un des deux fichiers n'existe pas, il continue sa boucle ?

    - Et enfin, comment puis-faire pour m'en sortir avec mes noms de fichiers (c'est à dire la décomposer la date) et réussir à créer ce décalage temporel ?

    Je me doute bien que c'est un problème long et surement prise de tête, j'espère qu'une ame charitable saurait m'aider, je tente en vain depuis 1 semaine de trouver une esquisse de solution.

    En espérant avoir été assez clair,
    Merci par avance pour toute réponse

  2. #2
    Membre averti Avatar de nekcorp
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2006
    Messages : 592
    Points : 383
    Points
    383
    Par défaut
    Citation Envoyé par yonafunu Voir le message
    je tente en vain depuis 1 semaine de trouver une esquisse de solution.
    Salut,

    Est ce que tu as un bout de code sur lequel tu as travaillé ? j'imagine qu'en 1 semaine t'as dû au moins écrire quelques lignes.

    - Comment faire une boucle en comparant deux noms de fichiers ? imaginons :
    if toto1.txt et mimi1.txt exists then (puis mes calculs suivent)
    Tu veux vérifier si les deux fichiers existent ? Tu veux comparer leur contenu ?

    - Comment faire pour que si un des deux fichiers n'existe pas, il continue sa boucle ?
    Faudrait que tu revois les tuto de python

    - Et enfin, comment puis-faire pour m'en sortir avec mes noms de fichiers (c'est à dire la décomposer la date) et réussir à créer ce décalage temporel ?
    Pareil qu'au dessus, faut revoir les tutos, et comprendre et pratiquer la manipulation de chaines de caractères.

    Je t'invite à lire la FAQ et aussi te tourner vers un bon tuto

  3. #3
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Citation Envoyé par yonafunu Voir le message
    J'ai deux ensembles de fichier, un venant d'un radar (avec 3250 fichiers), et l'autre provenant d'un modèle de simulation (3250 fichiers).
    Est-que tu peux affirmer que tu as exactement 3250 fichiers de chaque source et que ces fichiers couvrent forcément la même période de temps ? Si oui, tu prends les fichiers dans l'ordre alphabétique et ton problème est résolu. Si non...

    Citation Envoyé par yonafunu Voir le message
    - Comment faire une boucle en comparant deux noms de fichiers ? imaginons :
    if toto1.txt et mimi1.txt exists then (puis mes calculs suivent)
    ... et je présume que la réponse à la question précédente est non vu ce que tu dis ici.

    Il y a quand même un problème dans cette citation : ton pseudo-code vérifie l'existence de fichiers (https://docs.python.org/2/library/os...os.path.exists) alors que ton français souhaite comparer les noms (str1 != str2). La précision de langage évite des incompréhensions, il faut tenter d'être le plus précis possible.

    Citation Envoyé par yonafunu Voir le message
    - Comment faire pour que si un des deux fichiers n'existe pas, il continue sa boucle ?
    Euh.......
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    while condition:
        if a exist and b exists:
            do work
        else:
            log
    Citation Envoyé par yonafunu Voir le message
    - Et enfin, comment puis-faire pour m'en sortir avec mes noms de fichiers (c'est à dire la décomposer la date) et réussir à créer ce décalage temporel ?
    Crée une fonction qui gère ça. Par exemple, tu lui passes en paramètre le jour et l'heure et elle te renvoie les deux noms de fichiers (ou None si un des fichiers n'existe pas, ou elle lève une exception).

    Citation Envoyé par yonafunu Voir le message
    Je me doute bien que c'est un problème long et surement prise de tête)
    En fait, tu ne nous as pas décrit ton vrai problème. Tu nous as juste exposé des détails de code. Que souhaites-tu faire avec tes 7500 fichiers globalement ?


    PS : d'ailleurs, 2 * 3250 ça fait pas 6500 ?

  4. #4
    Membre du Club
    Inscrit en
    Mai 2011
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Mai 2011
    Messages : 72
    Points : 49
    Points
    49
    Par défaut
    Est-que tu peux affirmer que tu as exactement 3250 fichiers de chaque source et que ces fichiers couvrent forcément la même période de temps ? Si oui, tu prends les fichiers dans l'ordre alphabétique et ton problème est résolu. Si non...
    Et bien non justement...parfois il manquera un fichier au radar... d'ou la nécessité de comparer les noms de fichiers.

    Il y a quand même un problème dans cette citation : ton pseudo-code vérifie l'existence de fichiers (https://docs.python.org/2/library/os...os.path.exists) alors que ton français souhaite comparer les noms (str1 != str2). La précision de langage évite des incompréhensions, il faut tenter d'être le plus précis possible.
    Oui c'est vrai désolé. Pour être plus précis je veux que si dans la boucle le script arrive au fichier Simu_2016111920_sup.txt alors je veux qu'il vérifie qu'il y ait bien son correspondant pour le radar, soit Radar201611200.txt. Si cette comparaison est à True, alors j'ouvre les deux fichiers et je fais ma tambouille (chaque fichier à 3 colonnes avec des centaines de lignes, je fais des calculs entre eux...). Si c'est False (c'est à dire qu'il n'y a pas de fichier radar correspondant) alors je passe à l'itération suivant soit Simu_2016111921_sup.txt

    Crée une fonction qui gère ça. Par exemple, tu lui passes en paramètre le jour et l'heure et elle te renvoie les deux noms de fichiers (ou None si un des fichiers n'existe pas, ou elle lève une exception).
    Ah pas bête...je vais creuser de ce coté.

    PS : d'ailleurs, 2 * 3250 ça fait pas 6500 ?
    ...comment me discréditer en seulement quelques mots



    @Nekcorp : Non pas vérifier le contenu, juste vérifier qu'un fichier à son correspondant (si fichier simulation présent alors vérifier que c'est le cas aussi pour le radar) Le contenu je l'exploite après, en ouvrant ces deux fichiers à la suite de la condition de présence ou non.

    Merci à vous deux pour vos réponses en tout cas

  5. #5
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Finalement, en pseudo-code, il te faut quelque chose comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    for day in range(...):
        for hour in range(0, 24):
            try:
                file_radar, file_simulator = get_files(day, hour)
                log("blabla")
                do_some_work(file_radar, file_simulator)
            except MissingFileError:
                log("missing file")
    En général, on crée une fonction pour son pouvoir de factorisation. On peut ainsi centraliser du code dont on a besoin à plusieurs endroits.

    Néanmoins, il ne faut pas oublier le pouvoir de simplification que peut avoir une fonction. Même si un morceau de code n'est utilisé qu'à un seul endroit, ce seul endroit peut bénéficier de voir un morceau de code long et complexe remplacé par une fonction avec un nom simple et clair. Comme ici avec get_files(() et do_some_work((). Ici, on sépare bien la boucle de traitement, la récupération des noms de fichiers et le traitement unitaire d'un couple de fichiers. Et comme on a bien séparé ces 3 éléments, ils sont plus simples à comprendre, à développer et à maintenir.

Discussions similaires

  1. [AC-2013] Requete de MAJ avec comme condition une check box
    Par grpoirier dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 12/05/2016, 16h11
  2. Boucle « IF- Else-do » Avec comme condition la longueur des inputs.
    Par Sokol dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 16/04/2013, 14h55
  3. Réponses: 8
    Dernier message: 12/02/2013, 01h08
  4. Réponses: 3
    Dernier message: 11/04/2008, 09h31
  5. Requete de suppression avec en condition une date
    Par PrinceMaster77 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 29/04/2004, 09h23

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