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 :

Ranger un nom de fichier dans une variable


Sujet :

Python

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    etudiant
    Inscrit en
    Mars 2021
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : etudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2021
    Messages : 44
    Points : 27
    Points
    27
    Par défaut Ranger un nom de fichier dans une variable
    Bonjour,
    sauriez-vous comment récupérer une partie du nom d'un fichier pour l'utiliser comme variable ?

    Je souhaite faire une boucle sur les fichiers de mon répertoire, voici une partie des fichiers :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    LiO3S-2018-08-29.nc4
    LiO3S-2018-07-27.nc4
    LiO3S-2018-08-30.nc4
    LiO3S-2018-07-31.nc4

    Mon début de code ressemble à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
    import netCDF4 as ndf
    import matplotlib.pyplot as plt
    import numpy as np
    import glob
    import math
    from pylab import *
     
     
    ext="*.nc4"
    for files in sorted(glob.glob(ext),reverse=True):
        print(files)  
        part_ds = ndf.Dataset(files, "r", format="NETCDF4")
    (Je n'ai pas écris tout mon code, il s'agit juste du traitement des variables)

    Et voici comment j'écris mes valeurs dans un fichier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    with open('FilePart.txt', 'w') as fa:
        for item in TabnotAMA:
            fa.write("%s\n" % item)
    fa.close()
    J'aimerais juste récupérer la date utilisée dans le nom du fichier initial, pour l'utiliser dans le nom du fichier que j'écris, par exemple, pour le fichier initial "LiO3S-2018-08-30.nc4", je voudrais écrire un nouveau fichier nommé "FilePart_20180830.txt"

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 240
    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 240
    Points : 36 696
    Points
    36 696
    Par défaut
    Salut,

    Le noms de fichiers sont juste des chaines de caractères et vous savez qu'on peut concaténer des chaines de caractères avec un + (entre autres).

    Après pour fabriquer FilePart_20180830.txt à partir de LiO3S-2018-08-30.nc4, il faut commencer par extraire 2018-08-30.

    Et comme les noms sont de taille fixe, récupérer la sous chaine qui commence à un indice et se termine à un autre se fait avec une boucle ou des slices ([n:m]).

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

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    etudiant
    Inscrit en
    Mars 2021
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : etudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2021
    Messages : 44
    Points : 27
    Points
    27
    Par défaut
    Je me suis servi des slices, et ça semble très bien marcher, voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ext="*.nc4"
    for files in sorted(glob.glob(ext),reverse=True):
        print(files) 
        filename=(files[8:10]+files[11:13]+files[14:16])
    et à l'écriture dans le fichier de sortie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        with open('NotAMA'+filename+'.txt', 'w') as fa:
            for item in TabnotAMA:
                fa.write("%s\n" % item)
        fa.close()

    Merci pour les idées !

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 240
    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 240
    Points : 36 696
    Points
    36 696
    Par défaut
    Citation Envoyé par GlmGil Voir le message
    Je me suis servi des slices, et ça semble très bien marcher
    C'est juste fait pour... si çà ne marchait pas çà se saurait.

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

  5. #5
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 631
    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 631
    Points : 30 865
    Points
    30 865
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par GlmGil Voir le message
    Citation Envoyé par GlmGil Voir le message
    par exemple, pour le fichier initial "LiO3S-2018-08-30.nc4", je voudrais écrire un nouveau fichier nommé "FilePart_20180830.txt"
    Je me suis servi des slices, et ça semble très bien marcher
    Tout est dans le "ça semble". Déjà si files="LiO3S-2018-08-29.nc4" alors files[8:10] donne "18" et non "2018" donc ta solution ne matche pas ton propre cahier des charges. Mais on mettra ça sur une erreur d'étourderie.
    Mais si demain tu as des fichiers "LiO3S-S-2018-08-29.nc4" puis "LiO3S-S-S-2018-08-29.nc4" tout ton code s'écroule. Une solution plus souple aurait été de te caler sur des éléments "à priori" moins sujet à changement, comme par exemple le point qui sépare l'extension et le "-" qui sépare les tokens du nom.
    Exemple: (yy, mm, jj)="".join(files.split(".")[0]).split("-")[-3:]. Il y a toujours du slice et ça marche tout aussi bien... mais ça prend en compte ce type d'évolution donc (de mon point de vue) ça semblera mieux marcher...
    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
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 240
    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 240
    Points : 36 696
    Points
    36 696
    Par défaut
    Salut,

    Citation Envoyé par Sve@r Voir le message
    Une solution plus souple aurait été de te caler sur des éléments "à priori" moins sujet à changement, comme par exemple le point qui sépare l'extension et le "-" qui sépare les tokens du nom
    Il faut surtout vérifier que le pattern des fichiers est cohérent avec le code qui, derrière, compte dessus.

    Ce qui ici pourrait passer par vérifier que le nom de fichier se termine bien par ".nc4", puis que la chaine de caractères extraite via files[-14:-4] est bien de la forme YYYY-MM-DD (avec datetime.strptime).

    Mais c'est l'expérience qui apprend à faire gaffe et à bétonner un peu son code pour qu'on ne le réutilise pas trop facilement dans un autre contexte.

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

  7. #7
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    salut,

    avec une regex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> filename = 'LiO3S-2018-08-30.nc4'
    >>> re.sub(r'.+?-(\d{4})-(\d{2})-(\d{2})\.nc4', 'FilePart_\\1\\2\\3.txt', filename)
    'FilePart_20180830.txt'

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

Discussions similaires

  1. Récupérer le nom du fichier dans une variable
    Par Patrick07 dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 07/06/2011, 16h35
  2. Réponses: 0
    Dernier message: 22/06/2010, 16h53
  3. [load] Nom de fichier dans une variable
    Par captaine93 dans le forum MATLAB
    Réponses: 6
    Dernier message: 20/09/2009, 13h55
  4. Récupérer le nom d'un fichier dans une variable
    Par JeanDan dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 07/07/2009, 19h12
  5. Shell: récupérer le bon nom de fichier dans une variable
    Par claralavraie dans le forum Linux
    Réponses: 1
    Dernier message: 10/01/2006, 12h45

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