例如,我想让所有这些路径都返回
c
:a/b/c/
a/b/c
\a\b\c
\a\b\c\
a\b\c
a/b/../../a/b/c/
a/b/../../a/b/c
有一个函数可以完全返回你想要的内容
import os
print(os.path.basename(your_path))
警告: 在 POSIX 系统上使用os.path.basename()
从Windows样式的路径(例如"C:\\my\\file.txt"
)获取基本名称时,将返回整个路径。
以下示例是在运行在Linux主机上的交互式Python shell:
Python 3.8.2 (default, Mar 13 2020, 10:14:16)
[GCC 9.3.0] on Linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> filepath = "C:\\my\\path\\to\\file.txt" # A Windows style file path.
>>> os.path.basename(filepath)
'C:\\my\\path\\to\\file.txt'
os.path.basename(your_path)
运行成功了!我想要脚本路径:os.path.dirname(os.path.realpath(__file__))
和脚本名称:os.path.basename(os.path.realpath(__file__))
。谢谢! - TheWalkingDatafilepath.replace('\\', '/')
来获得跨平台的兼容性)。 - bobobobo正如其他人所建议的使用os.path.split
或os.path.basename
并不适用于所有情况:如果您在Linux上运行脚本并尝试处理典型的Windows风格路径,则会失败。
Windows路径可以使用反斜杠或正斜杠作为路径分隔符。因此,ntpath
模块(在Windows上运行时相当于os.path)将适用于所有平台上的所有路径(1)。
import ntpath
ntpath.basename("a/b/c")
当然,如果文件名以斜杠结尾,则基本名称为空,因此您需要编写自己的函数来处理它:def path_leaf(path):
head, tail = ntpath.split(path)
return tail or ntpath.basename(head)
验证:
>>> paths = ['a/b/c/', 'a/b/c', '\\a\\b\\c', '\\a\\b\\c\\', 'a\\b\\c',
... 'a/b/../../a/b/c/', 'a/b/../../a/b/c']
>>> [path_leaf(path) for path in paths]
['c', 'c', 'c', 'c', 'c', 'c', 'c']
(1) 注意:Linux 文件名可以包含反斜杠。因此,在 Linux 上,r'a/b\c'
总是指向 a
文件夹中的 b\c
文件,而在 Windows 上,则总是指向 a
文件夹中的 b
子文件夹中的 c
文件。因此,当路径中同时使用正斜杠和反斜杠时,您需要知道相关的平台才能正确解释它。在实践中,通常可以安全地假定它是 Windows 路径,因为在 Linux 文件名中很少使用反斜杠,但编写代码时请记住这一点,以免创建意外的安全漏洞。
os.path
内部加载 ntpath
模块。使用这个模块,甚至可以在Linux系统上处理 '\\'
路径分隔符。对于Linux系统,posixpath
模块(或者 os.path
)将简化路径操作以仅允许posix风格的 '/'
分隔符。 - moooeeeepr'C:\path\to\file.txt'
)时,你才需要使用ntpath模块。否则,你可以使用os.path中的函数。这是因为Linux系统通常允许在文件名中使用反斜杠字符(如答案所述)。 - moooeeeepos.path.basename(os.path.normpath(path))
吗? - Mr_and_Mrs_Dos.path.split是你要找的函数。
head, tail = os.path.split("/tmp/d/a.dat")
>>> print(tail)
a.dat
>>> print(head)
/tmp/d
pathlib.Path
:>>> from pathlib import Path
>>> Path("/tmp/d/a.dat").name
'a.dat'
.name
属性将返回路径中最后一个子元素的完整名称,无论它是文件还是文件夹。
pathlib.Path('some/path/to/file.dat').suffix
则返回文件扩展名。 - squarespiralimport os
file_location = '/srv/volume1/data/eds/eds_report.csv'
file_name = os.path.basename(file_location ) #eds_report.csv
location = os.path.dirname(file_location ) #/srv/volume1/data/eds
我个人最喜欢的是:
filename = fullname.split(os.sep)[-1]
如果你想自动获取文件名,可以这样做
import glob
for f in glob.glob('/your/path/*'):
print(os.path.split(f)[-1])
fname = str("C:\Windows\paint.exe").split('\\')[-1:][0]
这将返回:paint.exe
根据您的路径或操作系统更改split函数的分隔符值。
fname = str(path).split('/')[-1]
- asultan904c
:>>> import os
>>> path = 'a/b/c/'
>>> path = path.rstrip(os.sep) # strip the slash from the right side
>>> os.path.basename(path)
'c'
第二级:
>>> os.path.filename(os.path.dirname(path))
'b'
更新:我认为lazyr
提供了正确的答案。我的代码在Unix系统上将无法使用类似Windows的路径,反之亦然,在Windows系统上也无法使用类Unix的路径。
r"a\b\c"
,在Windows上也无法处理"a/b/c"
。 - Lauritz V. Thaulowos.path.isfile(path)
为 True
时,os.path.basename(path)
才能正常使用。因此,path = 'a/b/c/'
根本不是一个有效的文件名... - moooeeeepos.path.basename
是一种纯字符串处理函数。它不关心文件是否存在或者它是一个文件还是目录。因为末尾有斜杠,所以os.path.basename("a/b/c/")
返回""
。 - Lauritz V. Thaulowlazyr
你说得对!我没有考虑到那个。只做 path = path.replace('\\', '/')
安全吗? - Ski
\a\b\c
是一个有效的文件名。而仅返回c
可能是无效和危险的。 - undefined