python批量读取文件名_python - 从路径中提取文件名,无论os / path形式如何
python - 從路徑中提取文件名,無論os / path形式如何
無論操作系統或路徑格式是什么,我可以使用哪個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
Jerome asked 2019-01-10T15:17:43Z
14個解決方案
783 votes
實際上,有一個功能可以準確地返回您想要的功能
print(os.path.basename(your_path))
stranac answered 2019-01-10T15:18:42Z
526 votes
使用r'a/b\c'或b\c作為其他建議將不適用于所有情況:如果您在Linux上運行腳本并嘗試處理經典的Windows樣式路徑,它將失敗。
Windows路徑可以使用反斜杠或正斜杠作為路徑分隔符。 因此,r'a/b\c'模塊(在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上,它始終引用b文件夾b子文件夾中的c文件。 因此,當在路徑中使用向前和向后斜杠時,您需要知道相關平臺才能正確解釋它。 在實踐中,通??梢园踩丶僭O它是一個Windows路徑,因為Linux文件名中很少使用反斜杠,但在編寫代碼時請記住這一點,這樣就不會產生意外的安全漏洞。
Lauritz V. Thaulow answered 2019-01-10T15:18:19Z
147 votes
os.path.split這樣是你正在尋找的功能
head, tail = os.path.split("/tmp/d/a.dat")
>>> print(tail)
a.dat
>>> print(head)
/tmp/d
Jakob Bowyer answered 2019-01-10T15:19:04Z
31 votes
import os
head, tail = os.path.split(p)
print tail
假設p是輸入字符串,tail就是你想要的。
有關詳細信息,請參閱python os模塊文檔
number5 answered 2019-01-10T15:19:35Z
18 votes
在python 3中
>>> from pathlib import Path
>>> Path("/tmp/d/a.dat").name
'a.dat'
Kishan B answered 2019-01-10T15:19:57Z
9 votes
在您的示例中,您還需要從右側右側刪除斜杠以返回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的路徑。
Ski answered 2019-01-10T15:20:36Z
6 votes
fname = str("C:\Windows\paint.exe").split('\\')[-1:][0]
這將返回:paint.exe
更改有關路徑或操作系統的拆分功能的sep值。
Eslam Hamouda answered 2019-01-10T15:21:06Z
6 votes
這適用于linux和windows以及標準庫
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']
def path_leaf(path):
return path.strip('/').strip('\\').split('/')[-1].split('\\')[-1]
[path_leaf(path) for path in paths]
結果:
['c', 'c', 'c', 'c', 'c', 'c', 'c']
Csabka answered 2019-01-10T15:21:30Z
4 votes
我從未見過雙背路徑,它們是否存在? python模塊os的內置功能失敗了。 所有其他人都在工作,也是您給os.path.normpath()提出的警告:
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', 'a/./b/c', 'a\b/c']
for path in paths:
os.path.basename(os.path.normpath(path))
PythoNic answered 2019-01-10T15:21:53Z
3 votes
Windows分隔符可以是Unix文件名或Windows路徑。 Unix分隔符只能存在于Unix路徑中。 Unix分隔符的存在表示非Windows路徑。
以下將通過OS特定分隔符剝離(剪切尾隨分隔符),然后拆分并返回最右邊的值。 它很難看,但基于上面的假設很簡單。 如果假設不正確,請更新,我將更新此響應以匹配更準確的條件。
a.rstrip("\\\\" if a.count("/") == 0 else '/').split("\\\\" if a.count("/") == 0 else '/')[-1]
示例代碼:
b = ['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']
for a in b:
print (a, a.rstrip("\\" if a.count("/") == 0 else '/').split("\\" if a.count("/") == 0 else '/')[-1])
dusc2don answered 2019-01-10T15:22:30Z
3 votes
這是一個僅使用正則表達式的解決方案,它似乎適用于任何操作系統上的任何操作系統路徑。
不需要其他模塊,也不需要預處理:
import re
def extract_basename(path):
"""Extracts basename of a given path. Should Work with any OS Path on any OS"""
basename = re.search(r'[^\\/]+(?=[\\/]?$)', path)
if basename:
return basename.group(0)
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']
print([extract_basename(path) for path in paths])
# ['c', 'c', 'c', 'c', 'c', 'c', 'c']
extra_paths = ['C:\\', 'alone', '/a/space in filename', 'C:\\multi\nline']
print([extract_basename(path) for path in extra_paths])
# ['C:', 'alone', 'space in filename', 'multi\nline']
可以在這里測試正則表達式。
Eric Duminil answered 2019-01-10T15:23:08Z
2 votes
也許只是我的所有在一個解決方案中沒有重要的一些新的(關于創建臨時文件的臨時文件:D)
import tempfile
abc = tempfile.NamedTemporaryFile(dir='/tmp/')
abc.name
abc.name.replace("/", " ").split()[-1]
獲得abc.name的值將是這樣的字符串:'/tmp/tmpks5oksk7'所以我可以用空格.replace("/", " ")替換/,然后調用split().這將返回一個列表,我得到了[-1]列表的最后一個元素
無需導入任何模塊。
最好的祝福
4k3nd0
Akendo answered 2019-01-10T15:24:00Z
1 votes
為了完整起見,這里是針對python 3.2+的pathlib解決方案:
>>> from pathlib import PureWindowsPath
>>> 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']
>>> [PureWindowsPath(path).name for path in paths]
['c', 'c', 'c', 'c', 'c', 'c', 'c']
這適用于Windows和Linux。
Morgoth answered 2019-01-10T15:24:29Z
-5 votes
filename = path[path.rfind('/')+1:]
Qiyun answered 2019-01-10T15:24:44Z
總結
以上是生活随笔為你收集整理的python批量读取文件名_python - 从路径中提取文件名,无论os / path形式如何的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 无创dna是不是便是个圈套,做完感觉上当
- 下一篇: 有宫颈糜烂该怎么办