Рекурсивное разбиение имени пути (в Python)? - PullRequest
2 голосов
/ 18 февраля 2010

Я чувствую, что есть (должна быть?) Функция Python, которая рекурсивно разбивает строку пути на составляющие ее файлы и каталоги (кроме базового имени и dirname). Я написал один, но так как я использую Python для сценариев оболочки на 5+ компьютерах, я надеялся на что-то из стандартной библиотеки или более простой, что я могу использовать на лету.

import os

def recsplit(x):
    if type(x) is str: return recsplit(os.path.split(x))
    else: return (x[0]=='' or x[0] == '.' or x[0]=='/') and x[1:] or \
          recsplit(os.path.split(x[0]) + x[1:])

>>> print recsplit('main/sub1/sub2/sub3/file')
('main', 'sub1', 'sub2', 'sub3', 'file')

Есть ли идеи / идеи? ~ Спасибо ~

Ответы [ 3 ]

3 голосов
/ 18 февраля 2010

ОБНОВЛЕНИЕ: После всего этого с altsep текущий выбранный ответ даже не разделяется на обратную косую черту.

>>> import re, os.path
>>> seps = os.path.sep
>>> if os.path.altsep:
...   seps += os.path.altsep
...
>>> seps
'\\/'
>>> somepath = r"C:\foo/bar.txt"
>>> print re.split('[%s]' % (seps,), somepath)
['C:\\foo', 'bar.txt'] # Whoops!! it was splitting using [\/] same as [/]
>>> print re.split('[%r]' % (seps,), somepath)
['C:', 'foo', 'bar.txt'] # after fixing it
>>> print re.split('[%r]' % seps, somepath)
['C:', 'foo', 'bar.txt'] # removed redundant cruft
>>>

Теперь вернемся к тому, что мы должны бытьделать:

(конец обновления)

1. Тщательно продумайте, что вы просите - вы можете получить то, что хотите, а нечто вам нужно.

Если у вас есть относительные пути
r"./foo/bar.txt" (unix) и r"C:foo\bar.txt" (windows)
вы хотите
[".", "foo", "bar.txt"] (Unix) и ["C:foo", "bar.txt"] (Windows)
(обратите внимание на C: foo там) или вы хотите
["", "CWD", "foo", "bar.txt"] (Unix) и ["C:", "CWD", "foo", "bar.txt"] (Windows)
где CWD - текущий рабочий каталог (общесистемный в Unix, то есть в C: в Windows)?

2. Вам не нужно искать с помощью os.path.altsep -os.path.normpath () сделает разделители равномерными и приведёт в порядок другие странности, такие как foo/bar/zot/../../whoopsy/daisy/somewhere/else

Решение, шаг 1: отмените ваш путь с помощью os.path.normpath () или os.path.abspath ().

Шаг 2: выполнение без привязки_path.split (os.path.sep) не очень хорошая идея.Вы должны разбить его на части с помощью os.path.splitdrive (), а затем использовать несколько приложений os.path.split ().

Вот несколько примеров того, что произойдет на шаге 1 в Windows:

>>> os.path.abspath(r"C:/hello\world.txt")
'C:\\hello\\world.txt'
>>> os.path.abspath(r"C:hello\world.txt")
'C:\\Documents and Settings\\sjm_2\\hello\\world.txt'
>>> os.path.abspath(r"/hello\world.txt")
'C:\\hello\\world.txt'
>>> os.path.abspath(r"hello\world.txt")
'C:\\Documents and Settings\\sjm_2\\hello\\world.txt'
>>> os.path.abspath(r"e:hello\world.txt")
'E:\\emoh_ruo\\hello\\world.txt'
>>>

(текущий диск C, CWD на диске C \Documents and Settings\sjm_2 и CWD на диске E \emoh_ruo)

Я хотел бы предложить вамнапишите шаг 2 без конгломератов and и or, которые есть в вашем примере.Напишите код, как если бы ваша замена знала, где вы живете, и владеет бензопилой: -)

1 голос
/ 04 мая 2015

используйте это:

import os
def recSplitPath(path):
    elements = []
    while ((path != '/') and (path != '')):
        path, tail = os.path.split(path)
        elements.insert(0,tail)
    return elements

Это превращает /for/bar/whatever в ['for','bar','whatever]

0 голосов
/ 18 февраля 2010
path='main/sub1/sub2/sub3/file'
path.split(os.path.sep)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...