Hey,
I got a list of paths and I need to extract the first element of each path in a portable way, how would I do that?
['/abs/path/foo',
'rel/path',
'just-a-file']
to
['abs', 'rel', 'just-a-file']
Thanks in advance Oli
Hey,
I got a list of paths and I need to extract the first element of each path in a portable way, how would I do that?
['/abs/path/foo',
'rel/path',
'just-a-file']
to
['abs', 'rel', 'just-a-file']
Thanks in advance Oli
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']
There is a library call to handle splitting paths in a platform independent way but it only splits into two parts:
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]
Why not just use a 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']
and for 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']