python-3.x 给定一个路径,我如何只提取包含文件夹的名称?

mefy6pfw  于 2023-03-20  发布在  Python
关注(0)|答案(8)|浏览(288)

在Python中,我应该使用什么命令来获取包含我正在处理的文件的文件夹的名称?
"C:\folder1\folder2\filename.xml"
这里"folder2"是我想得到的。
我唯一想到的是使用os.path.split两次:

folderName = os.path.split(os.path.split("C:\folder1\folder2\filename.xml")[0])[1]

有没有更好的办法?

j8ag8udp

j8ag8udp1#

您可以使用dirname

os.path.dirname(path)

返回路径名path的目录名。这是通过将path传递给函数split()返回的对的第一个元素。
给定完整路径后,可以正常拆分以获取路径的最后一部分。例如,使用basename

os.path.basename(path)

返回路径名path的基本名称。这是通过将path传递给函数split()返回的对的第二个元素。注意,此函数的结果与Unix basename程序不同;其中basename for '/foo/bar/'返回'bar',basename()函数返回空字符串('')。
合计:

>>> import os
>>> path=os.path.dirname("C:/folder1/folder2/filename.xml")
>>> path
'C:/folder1/folder2'
>>> os.path.basename(path)
'folder2'
bfrts1fy

bfrts1fy2#

您希望使用dirname。如果您只需要一个目录,您可以使用os.path.basename,
当把所有这些放在一起时,它看起来像这样:

os.path.basename(os.path.dirname('dir/sub_dir/other_sub_dir/file_name.txt'))

这应该会得到“其他子目录”
下面的方法并不理想,但我最初提出,使用os.path.split,并简单地获取最后一项。它看起来像这样:

os.path.split(os.path.dirname('dir/sub_dir/other_sub_dir/file_name.txt'))[-1]
ncecgwcz

ncecgwcz3#

这是相当古老的,但如果你使用Python 3.4或更高版本,请使用PathLib。

# using OS
import os
path=os.path.dirname("C:/folder1/folder2/filename.xml")
print(path)
print(os.path.basename(path))

# using pathlib
import pathlib
path = pathlib.PurePath("C:/folder1/folder2/filename.xml")
print(path.parent)
print(path.parent.name)
qgzx9mmu

qgzx9mmu4#

os.path.dirname是您正在寻找的-

os.path.dirname(r"C:\folder1\folder2\filename.xml")

确保将r添加到字符串前面,以便将其视为原始字符串。
演示-

In [46]: os.path.dirname(r"C:\folder1\folder2\filename.xml")
Out[46]: 'C:\\folder1\\folder2'

如果您只需要folder2,则可以将os.path.basename与上述内容配合使用,例如-

os.path.basename(os.path.dirname(r"C:\folder1\folder2\filename.xml"))

演示-

In [48]: os.path.basename(os.path.dirname(r"C:\folder1\folder2\filename.xml"))
Out[48]: 'folder2'
ttisahbt

ttisahbt5#

您可以使用路径库

from pathlib import Path
Path(r"C:\folder1\folder2\filename.xml").parts[-2]

以上的输出如下:

'folder2'
wkyowqbh

wkyowqbh6#

你可以把完整的路径作为一个字符串,然后用你的操作系统的分隔符把它分割成一个列表,然后用负索引从列表末尾访问元素,得到程序名,文件夹名等。
就像这样:

import os
strPath = os.path.realpath(__file__)
print( f"Full Path    :{strPath}" )
nmFolders = strPath.split( os.path.sep )
print( "List of Folders:", nmFolders )
print( f"Program Name :{nmFolders[-1]}" )
print( f"Folder Name  :{nmFolders[-2]}" )
print( f"Folder Parent:{nmFolders[-3]}" )

以上的输出如下:

Full Path    :C:\Users\terry\Documents\apps\environments\dev\app_02\app_02.py
List of Folders: ['C:', 'Users', 'terry', 'Documents', 'apps', 'environments', 'dev', 'app_02', 'app_02.py']
Program Name :app_02.py
Folder Name  :app_02
Folder Parent:dev
8mmmxcuj

8mmmxcuj7#

我对可用的解决方案进行了改进,即与所有的一起工作的片段,
1.文件
1.带有培训斜杠的目录
1.不带培训斜杠的目录
我的解决办法是,

from pathlib import Path

def path_lastname(s):
    Path(s).with_name("foo").parts[-2]

解释

  • Path(s)-使用s创建自定义Path对象,但不解析它。
  • .with_name("foo")-向路径中添加一个伪文件foo
  • .parts[-2]返回字符串的倒数第二部分。-1部分将为foo
tcbh2hod

tcbh2hod8#

我用两种方法得到同样的回答:其中一个用途:

os.path.basename(filename)

由于我在脚本中发现错误,我更改为:

Path = filename[:(len(filename)-len(os.path.basename(filename)))]

由于python '\\',这是一种变通方法

相关问题