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 :

[string]Récuperer le nom du fichier


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut [string]Récuperer le nom du fichier
    Bonjour,

    Je récupère dans un string le chemin d'un fichier, donc du type "/home/siriru/monfic.txt"

    Je cherche à récupérer uniquement le nom du fichier soit "monfic". J'ai bien essayer de le trouver grace au "." mais si dans mon chemin j'ai un dossier du type "siriru.python" ca ne marche pas. Je suis sur que c'est très simple mais je ne vois pas !

    Merci !

    Siriru

  2. #2
    Membre Expert
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 941
    Par défaut
    Pour le faire de façon portable:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    >>> from os.path import basename, splitext
    >>> path = "/home/siriru/monfic.txt"
    >>> basename(path)
    'monfic.txt'
    >>> splitext(basename(path))[0]
    'monfic'

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Par défaut
    Il y a sans doute une autre possibilité et peut être bien meilleure à un titre ou a un autre, mais je pense à ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    ch = "/home/siriru.python/monfic.txt"
     
    print ch.rpartition('/')
     
    print ch.rpartition('/')[2]
     
    print ch.rpartition('/')[2].partition('.')
     
    print ch.rpartition('/')[2].partition('.')[0]

    EDIT:
    Ah ! je ne connais pas assez bien os, je vois.

  4. #4
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Bonsoir,

    Quels effets de style eyquem Mais je ne doute pas que tu trouve une autre solution.

    La solution la plus simple est bien sur os.path Siriru.

    Sinon eyquem en full texte:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    ch = "/home/siriru.python/monfic.txt"
     
    chlen = len(ch)
     
    while chlen > 0:
        caract = ch[chlen-1:chlen]
        if caract == '/':
            monindex = chlen
            chemin = ch[:monindex]
            fichier = ch[monindex:]
            break
        else:
            chlen -= 1
    print 'Chemin :', chemin, 'Fichier :', fichier
    @+

  5. #5
    Invité
    Invité(e)
    Par défaut
    Ha oui, surtout que je ne comprend même pas ton cote PauseKawa ^^. Je vais me contenter de la version os path ^^. Tu peux m'expliquer un peu ou me filer un lien qui m'expliquera la version full text ?

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Par défaut
    Oh lui..... Quels effets de style C’est on ne peut plus simple, connaissant les partition() (leur seul défaut est qu’elles sont un peu lentes, je crois).

    Est-ce pour te moquer gentiment de mon code que tu trouverais trop compliqué ? Je ne vais certes pas m’en montrer susceptible...

    Il n’y a pas besoin d’un quelconque import. Mais ce n’est pas un argument suffisant parce que si Siruru trafique des choses sur les chemins, os doit déjà avoir été importé dans son code.

    Mais c’est simple. S’il y a 4 lignes c’est pour bien montrer la décomposition des actions, et que les partition() produisent des triplets.

    Cependant il faut être sûr que ’/’ soit un séparateur dans les chemins manipulés. De ce point de vue la portabilité de la solution avec os est sans doute un plus.



    Ou bien est-ce un jeu: chercher une solution artificiellement compliquée ?
    Ton full text peut en effet se simplifier:

    - si on atteint break, on sort de la boucle; donc pas besoin de mettre chlen -= 1 dans un else:

    - la différence entre chlen et chlen-1 étant toujours 1, on peut simplement écrire caract = ch[chlen-1]

    - inutile de créer la référence caract pour repérer le caractère ch[chlen-1]

    - de même, l’alias monindex est inutile

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    ch = "/home/siriru.python/monfic.txt"
     
    chlen = len(ch)
     
    while chlen > 0:
        if ch[chlen-1] == '/':
            chemin = ch[:chlen]
            fichier = ch[chlen:]
            break
        chlen -= 1
    print 'Chemin :', chemin, 'Fichier :', fichier


    Et on continue:

    - on remplace while et chlen-=1 par une boucle for
    Je remplace chlen-1 par x. Donc plus besoin d’initialiser chlen, ou son remplaçant x , avant la boucle.
    - plus besoin non plus des références fichier et chemin

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ch = "/home/siriru.python/monfic.txt"
     
    for x in xrange(len(ch)-1,-1,-1):
        if ch[x] == '/':  break
    print 'Chemin :', ch[:x+1], 'Fichier :', ch[x+1:]
    Là je pense que c’est plus clair, n’est ce pas Siruru ?



    C’est pas fini:

    - cette boucle est bien lourdingue, elle fait ce que fait rfind() en un éclair (les find sont hyper rapides)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ch = "/home/siriru.python/monfic.txt"
     
    x = ch.rfind('/')
    print 'Chemin :', ch[:x+1], 'Fichier :', ch[x+1:]



    Et ça me donne l’idée que je cherchais désespérément pour faire plaisir à PauseKawa:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ch = "/home/siriru.python/monfic.tagda.tsoin.tsoin.txt"
     
    print 'Fichier :', ch[ch.rfind('/')+1:ch.rfind('.')]
    Fichier : monfic.tagda.tsoin.tsoin

  7. #7
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Bonjour,

    Citation Envoyé par eyquem Voir le message
    Est-ce pour te moquer gentiment de mon code que tu trouverais trop compliqué ? Je ne vais certes pas m’en montrer susceptible...
    Que nenni, c'est juste cette façon de refaire le monde et de regarder plus loin, mais toujours avec les explications bien sur, que j'adore.
    Et je suis servi par la suite

    Pour ce qui est des accentuations peut être :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> ch = 'a6r46df39v(Y5E##K %%$#ùûüÿàâçéèêëïîôœ)*~987'
    >>> unicode(ch, errors='ignore')
    u'a6r46df39v(Y5E##K %%$#)*~987'
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    >>> import re
    >>> ch = 'a6r46df39v(Y5E##K %%$#ùûüÿàâçéèêëïîôœ)*~987'
    >>> pat = re.compile('[a-zA-Z]+')
    >>> chmod = ''.join( m.group() for m in pat.finditer(unicode(ch, errors='ignore')) )
    >>> print chmod
    ardfvYEK
    >>>
    @+

    Edit: Je rajouterai juste que c'est avec ce genre de réponses aux sujets que j'avance dans mon auto formation. Aucun tutoriel ne remplaceras votre expérience.
    Donc merci à l'équipe du forum.

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

    Je ne connais pas de façon simple d'obtenir le nom de fichier à part par os.path.

    En effet, le nom de fichier peut être borné par:

    - à gauche: '/', '\', ':' ou début de chaine

    - à droite: '.' ou fin de chaine

    os.path fait ça dans tous les cas et en multiplateforme (ch=chemin):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nomdefichier = os.path.splitext(os.path.split(ch)[1])[0]
    avec, par exemple (ici sous Windows), le fichier db.py, on trouve 'db' dans les cas suivants:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ch = r"C:\Python26\Lib\bsddb\db.py"
    ch = "C:/Python26/Lib/bsddb/db.py"
    ch = "C:db.py"
    ch = "db.py"
    ch = "db"
    Tyrtamos

  9. #9
    Invité
    Invité(e)
    Par défaut
    Merci pour vos réponses. Maintenant je voudrais dans une chaine supprimer tout caractères non alphabetiques, comment faire ?

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 03/09/2008, 17h14
  2. Réponses: 1
    Dernier message: 14/02/2008, 10h11
  3. récuperer les noms de fichiers pdf, word, Txt
    Par hervé_débutant dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 02/08/2007, 11h36
  4. Réponses: 11
    Dernier message: 02/08/2007, 09h04
  5. [String] "Nettoyer" un nom de fichier/dossier
    Par Wookai dans le forum Langage
    Réponses: 5
    Dernier message: 16/08/2006, 11h27

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