如何仅获取Python路径的最后一部分?


232

在Python中,假设我有这样的路径:

/folderA/folderB/folderC/folderD/

我怎样才能得到folderD零件?

Answers:


389

使用os.path.normpath,然后os.path.basename

>>> os.path.basename(os.path.normpath('/folderA/folderB/folderC/folderD/'))
'folderD'

第一个去除所有尾部的斜杠,第二个给您路径的最后一部分。使用only basename会给出最后一个斜杠(在本例中为)之后的所有内容''


1
我最初以为rstrip('/')会更简单,但后来很快意识到我必须使用rstrip(os.path.sep),因此显然使用normpath是合理的。
Erik Kaplun 2014年

例如,这似乎不适用于Windows长路径,'\\\\?\\D:\\A\\B\\C\\'并且'\\\\?\\UNC\\svr\\B\\C\\'(返回空字符串) 解决方案适用于所有情况。
omasoud

25

你可以做

>>> import os
>>> os.path.basename('/folderA/folderB/folderC/folderD')

UPDATE1:如果您将其赋予/folderA/folderB/folderC/folderD/xx.py,则此方法有效。这给出了xx.py作为基本名称。我猜这不是您想要的。所以你可以这样做-

>>> import os
>>> path = "/folderA/folderB/folderC/folderD"
>>> if os.path.isdir(path):
        dirname = os.path.basename(path)

UPDATE2:正如lars指出的那样,进行更改以适应尾随的'/'。

>>> from os.path import normpath, basename
>>> basename(normpath('/folderA/folderB/folderC/folderD/'))
'folderD'

用Python认为,os.path.basename(“ ... /”)正确产生''。是的,我也发现次优。该...基本名(... ... normpath下面的解决方案是规范的,但。
卡梅隆莱尔德

@lars是的!刚刚看到,在这种情况下,先将路径规范化,然后再将其提供给基本名称。os.path.basename(os.path.normpath('/ folderA / folderB / folderC / folderD /'))
Srikar Appalaraju 2010年

到目前为止,UPDATE2是我发现的最佳方法。
2015年

23

使用python 3,您可以使用pathlib模块(pathlib.PurePath例如):

>>> import pathlib

>>> path = pathlib.PurePath('/folderA/folderB/folderC/folderD/')
>>> path.name
'folderD'

如果您想要文件所在的最后一个文件夹名称:

>>> path = pathlib.PurePath('/folderA/folderB/folderC/folderD/file.py')
>>> path.parent.name
'folderD'

18

这是我的方法:

>>> import os
>>> print os.path.basename(
        os.path.dirname('/folderA/folderB/folderC/folderD/test.py'))
folderD
>>> print os.path.basename(
        os.path.dirname('/folderA/folderB/folderC/folderD/'))
folderD
>>> print os.path.basename(
        os.path.dirname('/folderA/folderB/folderC/folderD'))
folderC

1
与上述方法相比,您的方法能解决什么不同/更好?
user1767754

9

我一直在寻找一种解决方案,以获取文件所在的最后一个文件夹名(我只是使用split了两次)以获取正确的部分。这不是问题,但Google在这里转移了我。

pathname = "/folderA/folderB/folderC/folderD/filename.py"
head, tail = os.path.split(os.path.split(pathname)[0])
print(head + "   "  + tail)

2

一个幼稚的解决方案(Python 2.5.2+):

s="/path/to/any/folder/orfile"
desired_dir_or_file = s[s.rindex('/',0,-1)+1:-1] if s.endswith('/') else s[s.rindex('/')+1:]

为什么有人会使用这个?
Chris_Rands '18 -10-5

1

我喜欢Path 的part方法:

grandparent_directory, parent_directory, filename = Path(export_filename).parts[-3:]
log.info(f'{t: <30}: {num_rows: >7} Rows exported to {grandparent_directory}/{parent_directory}/{filename}')


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.