2010-09-19 1 views
5

Ho ottenuto un elenco di percorsi e ho bisogno di estrarre il primo elemento di ogni percorso in modo portatile, come farei?Primo elemento di un percorso in python

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

a

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

Grazie in anticipo Oli

risposta

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

Quello non è portatile, prendere in considerazione un percorso del tipo "C: \ Users \ foo", che dovrebbe tradursi in "Utenti", ma con la vostra soluzione è abituato. –

+8

Se si desidera eliminare le unità, chiamare 'os.path.splitdrive (p) [1]' su ciascuno dei percorsi in anticipo. (A proposito, non hai mai specificato cosa volevi fare nel caso di lettere di unità nel post originale. Non aspettarti che ti leggiamo.) –

2

C'è una chiamata di libreria per gestire percorsi di spaccare in modo indipendente dalla piattaforma, ma si divide solo in due parti:

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

Perché non usare una 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'] 

e per 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']