разделить дважды в одном выражении? - PullRequest
5 голосов
/ 27 ноября 2008

Представьте, что у меня есть следующее:

inFile = "/adda/adas/sdas/hello.txt"

# that instruction give me hello.txt
Name = inFile.name.split("/") [-1]

# that one give me the name I want - just hello
Name1 = Name.split(".") [0]

Есть ли возможность упростить выполнение одной и той же работы в одном выражении?

Ответы [ 5 ]

20 голосов
/ 27 ноября 2008

Вы можете получить нужную платформу независимо, используя os.path.basename , чтобы получить последнюю часть пути, а затем используйте os.path.splitext , чтобы получить имя файла. без расширения.

from os.path import basename, splitext

pathname = "/adda/adas/sdas/hello.txt"
name, extension = splitext(basename(pathname))
print name # --> "hello"

Использование os.path.basename и os.path.splitext вместо str.split или re.split более корректно (и поэтому получает больше баллов, чем любой другой ответ ) потому что он не ломается на других платформах, которые используют разные разделители пути (вы будете удивлены, насколько это может быть разным) .

Он также несет наибольшее количество очков, так как он отвечает на ваш вопрос для «одной строкой» точно и эстетически более приятны, то ваш пример (несмотря на то, что спорно, как и все вопросы вкуса)

2 голосов
/ 28 ноября 2008

Отвечая на вопрос в теме, а не пытаясь проанализировать пример ...

Вы действительно хотите использовать Florians решение, если вы хотите разделить пути, но если вы пообещаете не использовать это для разбора пути ...

Вы можете использовать re.split () , чтобы разделить, используя несколько разделителей, или: с помощью '|' посмотрите на это:

import re
inFile = "/adda/adas/sdas/hello.txt"
print re.split('\.|/', inFile)[-2]
1 голос
/ 27 ноября 2008

если путь всегда будет таким, как указано выше, вы можете использовать os.path.split и os.path.splitext

В следующем примере будет напечатано только привет

from os.path import split, splitext
path = "/adda/adas/sdas/hello.txt"
print splitext(split(path)[1])[0]

Подробнее см. https://docs.python.org/library/os.path.html

1 голос
/ 27 ноября 2008
>>> inFile = "/adda/adas/sdas/hello.txt"
>>> inFile.split('/')[-1]
'hello.txt'
>>> inFile.split('/')[-1].split('.')[0]
'hello'
0 голосов
/ 27 ноября 2008

Я почти уверен, что некоторые Regex-Ninja * дадут вам более или менее вменяемый способ сделать это (или, как я теперь вижу, другие опубликовали: способы написать два выражения в одной строке ...)

Но мне интересно, почему вы хотите разделить его одним выражением? Для такого простого разделения, вероятно, быстрее сделать два, чем создать какую-то продвинутую логику. Если вы разделите пополам дважды, это также безопаснее:

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

* (Любые вменяемые пользователи регулярных выражений, не должны обижаться.;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...