Python 从路径中提取文件名,无论操作系统/路径格式如何

Python 从路径中提取文件名,无论操作系统/路径格式如何,python,Python,无论操作系统或路径格式如何,我都可以使用哪个Python库从路径中提取文件名 例如,我希望所有这些路径都返回我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 >>> path = 'a/b/c/' >>> path = path.rstrip(os.sep) # strip the slash from the right

无论操作系统或路径格式如何,我都可以使用哪个Python库从路径中提取文件名

例如,我希望所有这些路径都返回我
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
>>> path = 'a/b/c/'
>>> path = path.rstrip(os.sep) # strip the slash from the right side
>>> os.path.basename(path)
'c'
是您正在寻找的功能

head, tail = os.path.split("/tmp/d/a.dat")

>>> print(tail)
a.dat
>>> print(head)
/tmp/d
是您正在寻找的功能

head, tail = os.path.split("/tmp/d/a.dat")

>>> print(tail)
a.dat
>>> print(head)
/tmp/d
tail是您想要的文件名

有关详细信息,请参阅

tail是您想要的文件名


有关详细信息,请参见使用
os.path.split
或其他人建议的
os.path.basename
在所有情况下都不起作用:如果您在Linux上运行脚本并尝试处理经典的windows样式路径,则会失败

Windows路径可以使用反斜杠或正斜杠作为路径分隔符。因此,
ntpath
模块(在windows上运行时相当于os.path)将适用于所有平台上的所有(1)路径

import ntpath
ntpath.basename("a/b/c")
当然,如果文件以斜杠结尾,则basename将为空,因此请使用您自己的函数来处理它:

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.split
os.path.basename
在所有情况下都不起作用:如果您在Linux上运行脚本并试图处理经典的windows风格的路径,则会失败

Windows路径可以使用反斜杠或正斜杠作为路径分隔符。因此,
ntpath
模块(在windows上运行时相当于os.path)将适用于所有平台上的所有(1)路径

import ntpath
ntpath.basename("a/b/c")
当然,如果文件以斜杠结尾,则basename将为空,因此请使用您自己的函数来处理它:

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文件名中使用,但在编写代码时请记住这一点,这样就不会造成意外的安全漏洞。

实际上,有一个

import os
print(os.path.basename(your_path))
警告:在POSIX系统上使用
os.path.basename()
从Windows样式的路径(例如
“C:\\my\\file.txt”
)获取基本名称时,将返回整个路径

以下示例来自Linux主机上运行的交互式python shell:

事实上,有一种方法能准确地返回你想要的

import os
print(os.path.basename(your_path))
警告:在POSIX系统上使用
os.path.basename()
从Windows样式的路径(例如
“C:\\my\\file.txt”
)获取基本名称时,将返回整个路径

以下示例来自Linux主机上运行的交互式python shell:


在您的示例中,还需要从右侧删除斜杠以返回
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
>>> 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路径。

在您的示例中,您还需要从右侧删除斜杠才能返回
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
>>> 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的路径相比,我的代码可能只是我的多功能一体解决方案,没有一些重要的新功能(关于创建临时文件的tempfile:D)

获取abc.name的值将是如下字符串:
'/tmp/tmpks5oksk7'
因此,我可以将
/
替换为一个空格
。替换(“/”,“”)
,然后调用
split()
。这将返回一个列表,我得到 带有
[-1]


无需导入任何模块

可能只是我的多功能一体解决方案,没有一些重要的新功能(关于创建临时文件的tempfile:D)

fname = str("C:\Windows\paint.exe").split('\\')[-1:][0]
获取abc.name的值将是如下字符串:
'/tmp/tmpks5oksk7'
因此,我可以将
/
替换为一个空格
。替换(“/”,“”)
,然后调用
split()
。这将返回一个列表,我得到 带有
[-1]

无需导入任何模块

fname = str("C:\Windows\paint.exe").split('\\')[-1:][0]
这将返回:paint.exe

更改有关路径或操作系统的拆分函数的sep值

这将返回:paint.exe

更改有关路径或操作系统的拆分函数的sep值


我从未见过双反斜杠路径,它们是否存在?python模块
os
的内置功能无法满足这些需求。所有其他方法都有效,您使用
os.path.normpath()
给出的警告也有效:


我从未见过双反斜杠路径,它们是否存在?python模块
os
的内置功能无法满足这些需求。所有其他方法都有效,您使用
os.path.normpath()
给出的警告也有效:


这适用于linux a
>>> from pathlib import Path    
>>> Path("/tmp/d/a.dat").name
'a.dat'
import posixpath  # to generate unix paths
from pathlib2 import PurePath, PureWindowsPath, PurePosixPath

def path2unix(path, nojoin=True, fromwinpath=False):
    """From a path given in any format, converts to posix path format
    fromwinpath=True forces the input path to be recognized as a Windows path (useful on Unix machines to unit test Windows paths)"""
    if not path:
        return path
    if fromwinpath:
        pathparts = list(PureWindowsPath(path).parts)
    else:
        pathparts = list(PurePath(path).parts)
    if nojoin:
        return pathparts
    else:
        return posixpath.join(*pathparts)
In [9]: path2unix('lala/lolo/haha.dat')
Out[9]: ['lala', 'lolo', 'haha.dat']

In [10]: path2unix(r'C:\lala/lolo/haha.dat')
Out[10]: ['C:\\', 'lala', 'lolo', 'haha.dat']

In [11]: path2unix(r'C:\lala/lolo/haha.dat') # works even with malformatted cases mixing both Windows and Linux path separators
Out[11]: ['C:\\', 'lala', 'lolo', 'haha.dat']
In [12]: testcase = 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']

In [14]: for t in testcase:
    ...:     print(path2unix(t)[-1])
    ...:
    ...:
c
c
c
c
c
c
c
import os
path_str = "/var/www/index.html"
print(os.path.basename(path_str))
import os
path_str = "/home/some_str/last_str/"
split_path = path_str.rsplit("/",1)
print(os.path.basename(split_path[0]))
import os
path_str = "c:\\var\www\index.html"
print(os.path.basename(path_str))

import os
path_str = "c:\\home\some_str\last_str\\"
split_path = path_str.rsplit("\\",1)
print(os.path.basename(split_path[0]))
import glob

for f in glob.glob('/your/path/*'):
    print(os.path.split(f)[-1])
filename = fullname.split(os.sep)[-1]
import os as os
import glob as glob
path = 'mypath'
file_list= []
for file in glob.glob(path):
    data_file_list = os.path.basename(file)
    file_list.append(data_file_list)