2014-10-12 6 views
1

Как я могу получить самую левую часть относительного пути в python?Как получить левую часть пути в python?

я начал что-то вроде этого:

/var/tmp/workdir/1/foo/bar/test.jpg 

Затем я удалил некоторые из них, чтобы получить:

1/foo/bar/test.jpg 

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

rel_path = os.path.relpath(path,base_dir) 

Теперь, как я могу получить максимальную левая часть - «1»?

Я могу найти инструменты, которые идут с правой стороны, но в этом случае я хочу самую левую вещь, потому что она соответствует идентификатору пользователя. Также я хочу избежать перехода с правой стороны, потому что может быть больше подкаталогов.

+0

Вы можете использовать регулярные выражения или, если идентификатор всегда на том же месте, вы можете разделить на «/» и получить требуемые элемент. – nacholibre

ответ

3

Использование str.split может приводить неверные результаты, если имена содержат os.path.sep (ускользнул, конечно). Самое безопасное решение imho:

basename = None # guards against UnboundLocalError in case of empty rel_path 
while rel_path: 
    rel_path, basename = os.path.split(rel_path) 
print basename # this will be the leftmost component 
+1

Я понимаю, что, что самое меньшее, что я хочу сделать, это использовать команды split, чтобы вручную получить первую часть. Но почему нет команды, чтобы просто получить первую часть? Я думаю, ваш подход будет, но это пустая трата процессора, не так ли? – JasonTS

+1

Я не думаю, что вам стоит беспокоиться о процессоре: '100000 петель, лучше всего 3: 4,339 мкс за цикл'. Если вы не собираетесь разбирать тысячи путей, то, во-вторых, каждые сотни компонентов ... –

0

Если вы используете Python 3.4, для этого вы можете использовать новый pathlib.

В противном случае, вы могли бы просто использовать обычные манипуляции со строками, чтобы получить ту часть, например, с str.partition:

>>> path = '1/foo/bar/test.jpg' 
>>> path.partition('/') 
('1', '/', 'foo/bar/test.jpg') 

Вы также можете использовать os.sep вместо '/' если вы хотите разделить на разделителе пути операционной системы.

1

poke упомянул библиотеку pathlib, встроенную в Python 3.4. Вы также можете использовать pathlib на Python 2.6 или 2.7, запустив pip install pathlib, как указано здесь: http://pathlib.readthedocs.org/en/pep428.

Ваш код будет выглядеть следующим образом:

>>> from pathlib import PurePath 
>>> p = PurePath('1/foo/bar/test.jpg') 
>>> p.parts 
('1', 'foo', 'bar', 'test.jpg') 

И использовать p.parts[0], чтобы получить часть, которую вы хотите.

На самом деле, вы могли бы сделать все это с pathlib следующим образом:

>>> from pathlib import PurePath 
>>> p = PurePath('/var/tmp/workdir/1/foo/bar/test.jpg') 
>>> p = p.relative_to('/var/tmp/workdir') 
>>> p.parts 
('1', 'foo', 'bar', 'test.jpg') 
+0

Спасибо. Я тоже это рассмотрю. Но я думаю, что пока я поеду с циклом while, потому что таким образом мне не нужны дополнительные библиотеки. Но если я больше столкнулся с этим, я переключусь на ваше решение. Еще раз спасибо! – JasonTS

Смежные вопросы