繁体   English   中英

在Python中获取文件的文件夹名称

[英]Get folder name of the file in Python

在 Python 中,我应该使用什么命令来获取包含我正在使用的文件的文件夹的名称?

"C:\\folder1\\folder2\\filename.xml"

这里"folder2"是我想要的。

我唯一想到的是使用os.path.split两次:

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

有没有更好的方法来做到这一点?

您可以使用dirname

 os.path.dirname(path)

返回路径名路径的目录名。 这是通过将路径传递给函数 split() 返回的元素对的第一个元素。

并给出完整路径,然后您可以正常拆分以获得路径的最后一部分。 例如,通过使用basename

 os.path.basename(path)

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


全部一起:

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

您正在寻找使用dirname 如果你只想要那个目录,你可以使用os.path.basename

放在一起时,它看起来像这样:

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

那应该让你“other_sub_dir”

以下不是理想的方法,但我最初提出,使用os.path.split,并简单地获取最后一项。 看起来像这样:

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

这已经很老了,但是如果您使用的是 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)

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'

您可以将完整路径作为字符串获取,然后使用操作系统的分隔符将其拆分为列表。 然后通过使用负索引访问列表末尾的元素来获取程序名称、文件夹名称等。

像这样:

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

你可以使用路径库

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

上面的输出是这样的:

'folder2'

我使用 2 种方法来获得相同的响应:其中一种使用:

   os.path.basename(filename)

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

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

由于python的'\\\\'这是一种解决方法

我对可用的解决方案进行了改进,即适用于所有解决方案的片段,

  1. 文件
  2. 带有培训斜线的目录
  3. 没有培训斜线的目录

我的解决办法是

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM