2010-09-19 4 views
5

J'ai obtenu une liste de chemins et j'ai besoin d'extraire le premier élément de chaque chemin de manière portable, comment ferais-je cela?Premier élément d'un chemin en python

['/abs/path/foo', 
'rel/path', 
'just-a-file'] 

à

['abs', 'rel', 'just-a-file'] 

Merci à l'avance Oli

Répondre

6
In [69]: import os 

In [70]: paths 
Out[70]: ['/abs/path/foo', 'rel/path', 'just-a-file'] 

In [71]: [next(part for part in path.split(os.path.sep) if part) for path in paths] 
Out[71]: ['abs', 'rel', 'just-a-file'] 
+1

Thats pour ne pas portable, pensez à un chemin comme "C: \ Users \ foo" qui devrait aboutir à des "utilisateurs", mais avec votre solution il ne sera pas. –

+8

Si vous voulez vous débarrasser des lecteurs, appelez 'os.path.splitdrive (p) [1]' sur chacun des chemins au préalable. (BTW, vous n'avez jamais spécifié ce que vous vouliez faire dans le cas des lettres de lecteur dans le message original.) Ne vous attendez pas à ce que nous lisions votre avis.) –

2

Il y a un appel de bibliothèque pour gérer les chemins se séparer en une plate-forme de manière indépendante, mais il divise seulement en deux parties:

import os.path 

def paths(p) : 
    head,tail = os.path.split(p) 
    components = [] 
    while len(tail)>0: 
    components.insert(0,tail) 
    head,tail = os.path.split(head) 
    return components 

for p in ['/abs/path/foo','rel/path','just-a-file'] : 
    print paths(p)[0] 
-4

Pourquoi ne pas simplement utiliser une regex?

>>> import re 
>>> paths = ['/abs/path/foo', 
...   'rel/path', 
...   'just-a-file'] 
>>> 
>>> [re.match(r'\/?([^\/]+)', p).groups()[0] for p in paths] 
['abs', 'rel', 'just-a-file'] 

et pour Windows:

>>> paths = [r'\abs\path\foo', 
...   r'rel\path', 
...   r'just-a-file', 
...   r'C:\abs\path\foo', 
...   r'C:rel\path', 
...   r'C:just-a-file'] 
>>> 
>>> [re.match(r'(?:[A-Za-z]:)?\\?([^\\]+)', p).groups()[0] for p in paths] 
['abs', 'rel', 'just-a-file', 'abs', 'rel', 'just-a-file'] 
Questions connexes