Первый элемент пути в питоне - PullRequest
5 голосов
/ 20 сентября 2010

У меня есть список путей, и мне нужно извлечь первый элемент каждого пути в переносном виде, как бы я это сделал?Заранее спасибо Оли

Ответы [ 4 ]

6 голосов
/ 20 сентября 2010
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']
2 голосов
/ 20 сентября 2010

Существует библиотечный вызов для обработки путей разделения независимо от платформы, но он разбивается только на две части:

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]
1 голос
/ 16 мая 2019

Использование более нового метода pathlib ...

import PurePath from pathlib
import os

# Separates the paths into parts and prints to the console...
def print_path_parts(path: str):

    path = PurePath(path)
    parts = list(path.parts)

    # From your description, looks like you don't want the root.
    # Pop it off.
    if parts[0] == os.sep:
        parts.pop(0)

    print(parts)

# Array of path strings...
paths = ['/abs/path/foo',
         'rel/path',
         'just-a-file']

# For each path, print parts to the console
for path in paths:
    print_path_parts(path)

Выход:

['abs', 'path', 'foo']
['rel', 'path']
['just-a-file']
0 голосов
/ 20 сентября 2010

Почему бы просто не использовать регулярные выражения?

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

и для 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']
...