Вопрос о путях в Python - PullRequest
       11

Вопрос о путях в Python

1 голос
/ 14 июля 2009

скажем, у меня есть пути к каталогам, выглядящие так:

this/is/the/basedir/path/a/include
this/is/the/basedir/path/b/include
this/is/the/basedir/path/a
this/is/the/basedir/path/b

В Python, как я могу разделить эти пути, чтобы они выглядели так:

a/include
b/include
a
b

Если я запускаю os.path.split (path) [1], он будет отображать:

include
include
a
b

Что я должен попробовать здесь, должен ли я посмотреть какую-то команду регулярного выражения или это можно сделать без нее? Заранее спасибо.

РЕДАКТИРОВАТЬ ВСЕ: Я решил это с помощью регулярных выражений, чертовски удобный инструмент:)

Ответы [ 4 ]

3 голосов
/ 14 июля 2009

Возможно, что-то вроде этого зависит от того, насколько жестко задан ваш префикс:

def removePrefix(path, prefix):
    plist = path.split(os.sep)
    pflist = prefix.split(os.sep)
    rest = plist[len(pflist):]
    return os.path.join(*rest)

Использование:

print removePrefix("this/is/the/basedir/path/b/include", "this/is/the/basedir/path")
b/include

Предполагается, что вы находитесь на платформе, где разделитель каталогов (os.sep) действительно является косой чертой).

Этот код пытается обрабатывать пути как нечто более высокоуровневое, чем простые строки. Однако это не оптимально, вы можете (или должны) сделать больше очистки и канонизации, чтобы быть более безопасными.

1 голос
/ 14 июля 2009

Может быть, что-то вроде этого:

result = []

prefix = os.path.commonprefix(list_of_paths)
for path in list_of_paths:
    result.append(os.path.relpath(path, prefix))

Это работает только в 2.6. Relpath в версии 2.5 и раньше работает только в том случае, если путь является текущим рабочим каталогом.

1 голос
/ 14 июля 2009

как насчет раздела ?
Он разбивает строку при первом появлении sep и возвращает 3-кортеж, содержащий часть перед разделителем, сам разделитель и часть после разделителя. Если разделитель не найден, верните 3 кортежа, содержащего саму строку, за которой следуют две пустые строки.

data = """this/is/the/basedir/path/a/include
this/is/the/basedir/path/b/include
this/is/the/basedir/path/a
this/is/the/basedir/path/b"""
for line in data.splitlines():
    print line.partition("this/is/the/basedir/path/")[2]

#output
a/include
b/include
a
b

Обновлено для нового комментария автора:
Похоже, вам нужен rsplit для разных каталогов в зависимости от того, заканчивается ли каталог "include" из not:

import os.path
data = """this/is/the/basedir/path/a/include
this/is/the/basedir/path/b/include
this/is/the/basedir/path/a
this/is/the/basedir/path/b"""
for line in data.splitlines():
    if line.endswith('include'):
        print '/'.join(line.rsplit("/",2)[-2:])
    else:
        print os.path.split(line)[1]
        #or just
        # print line.rsplit("/",1)[-1]
#output
a/include
b/include
a
b
0 голосов
/ 14 июля 2009

Хотя критерий не ясен на 100%, из комментария ОП видно, что ключевой вопрос заключается в том, заканчивается ли последний компонент пути «включением». Если это так, и чтобы избежать ошибок, когда последний компонент, например, "dontinclude" (как другой ответ делает, пытаясь сопоставить строку вместо сопоставления пути), я предлагаю:

def lastpart(apath):
    pieces = os.path.split(apath)
    final = -1
    if pieces[-1] == 'include':
        final = -2
    return '/'.join(pieces[final:])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...