【发布时间】:2011-04-24 21:59:57
【问题描述】:
在 Python 中,假设我有这样的路径:
/folderA/folderB/folderC/folderD/
我怎样才能只得到folderD 部分?
【问题讨论】:
-
path.split('/')[len(path.split('/'))-1:][0]
标签: python path path-manipulation
在 Python 中,假设我有这样的路径:
/folderA/folderB/folderC/folderD/
我怎样才能只得到folderD 部分?
【问题讨论】:
标签: python path path-manipulation
如果你使用原生的python包pathlib真的很简单。
>>> from pathlib import Path
>>> your_path = Path("/folderA/folderB/folderC/folderD/")
>>> your_path.stem
'folderD'
假设您有文件夹 D 中文件的路径。
>>> from pathlib import Path
>>> your_path = Path("/folderA/folderB/folderC/folderD/file.txt")
>>> your_path.stem
'file.txt'
>>> your_path.parent
'folderD'
【讨论】:
在我当前的项目中,我经常将路径的后面部分传递给函数,因此使用Path 模块。为了以相反的顺序获得第 n 部分,我使用:
from typing import Union
from pathlib import Path
def get_single_subpath_part(base_dir: Union[Path, str], n:int) -> str:
if n ==0:
return Path(base_dir).name
for _ in range(n):
base_dir = Path(base_dir).parent
return getattr(base_dir, "name")
path= "/folderA/folderB/folderC/folderD/"
# for getting the last part:
print(get_single_subpath_part(path, 0))
# yields "folderD"
# for the second last
print(get_single_subpath_part(path, 1))
#yields "folderC"
此外,要以包含剩余路径的路径的相反顺序传递第 n 部分,我使用:
from typing import Union
from pathlib import Path
def get_n_last_subparts_path(base_dir: Union[Path, str], n:int) -> Path:
return Path(*Path(base_dir).parts[-n-1:])
path= "/folderA/folderB/folderC/folderD/"
# for getting the last part:
print(get_n_last_subparts_path(path, 0))
# yields a `Path` object of "folderD"
# for second last and last part together
print(get_n_last_subparts_path(path, 1))
# yields a `Path` object of "folderc/folderD"
请注意,此函数返回一个Pathobject,它可以很容易地转换为字符串(例如str(path))
【讨论】:
我正在寻找一种解决方案来获取文件所在的最后一个文件夹名称,我只使用了两次split,以获得正确的部分。这不是问题,但谷歌将我转移到这里。
pathname = "/folderA/folderB/folderC/folderD/filename.py"
head, tail = os.path.split(os.path.split(pathname)[0])
print(head + " " + tail)
【讨论】:
os.path.basename(os.path.dirname(pathname)),这将在您的示例中给出folderD。查看@Mike Miterer 的回答
我喜欢 Path 的 parts 方法:
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}')
【讨论】:
'/'.join(Path(export_filename).parts[-3:])
在 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'
【讨论】:
PurePath vs Path,第一个提供“纯计算操作”(无 I/O),而另一个(“具体路径”)继承自首先,还提供 I/O 操作。
这是我的方法:
>>> 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
【讨论】:
/ 的陷阱(并且不需要纯路径)
你可以的
>>> 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'
【讨论】:
使用os.path.normpath,然后使用os.path.basename:
>>> os.path.basename(os.path.normpath('/folderA/folderB/folderC/folderD/'))
'folderD'
第一个去掉任何尾部斜杠,第二个给你路径的最后一部分。仅使用 basename 会给出最后一个斜杠之后的所有内容,在本例中为 ''。
str = "/folderA/folderB/folderC/folderD/"
print str.split("/")[-2]
【讨论】:
folderD。不是folderC
os.path 模块。
path = "/folderA/folderB/folderC/folderD/"
last = path.split('/').pop()
【讨论】:
os.path 模块。