如何使用 python 只获取路径的名称?

我有以下字符串:

a = "/home/user/Downloads/repo/test.txt"

我的目标只是创建一个只包含 test的字符串,我该怎么做呢?

实际上 a来自

f = tkFileDialog.asksaveasfile(mode='w', defaultextension=".txt")

a等于 a = f.name

但是我意识到 f.name并不仅仅给我文件的名称。

125765 次浏览

Use the os.path module to work with paths; the os.path.basename() function gives you the last part after the last path separator, and os.path.splitext() gives you the filename with the extension split off:

import os.path


basename = os.path.splitext(os.path.basename(f.name))[0]

Using the os.path functions ensures that your code will continue to work correctly on different operating systems, even if the path separators are different.

In Python 3.4 or newer (or as a separate backport install), you can also use the pathlib library, which offers a more object-oriented approach to path handling. pathlib.Path() objects have a .stem attribute, which is the final component without the extension suffix:

try:
import pathlib
except ImportError:
# older Python version, import the backport instead
import pathlib2 as pathlib


basename = pathlib.Path(f.name).stem

Demo:

>>> import os.path
>>> a = "/home/user/Downloads/repo/test.txt"
>>> os.path.basename(a)
'test.txt'
>>> os.path.splitext(os.path.basename(a))
('test', '.txt')
>>> os.path.splitext(os.path.basename(a))[0]
'test'
>>> import pathlib
>>> pathlib.Path(a)
PosixPath('/home/user/Downloads/repo/test.txt')
>>> pathlib.Path(a).stem
'test'

In Python 3.4+, you can use the pathlib module (included in Python's standard library):

>>> from pathlib import Path
>>> p = Path("/home/user/Downloads/repo/test.txt")
>>> print(p.stem)
test
>>> print(p.name)
test.txt

It seems that you're either looking for os.path.basename or os.path.splitext:

>>> import os.path
>>> os.path.basename("/var/log/err.log")
'err.log'
>>> os.path.splitext(os.path.basename("/var/log/err.log"))
('err', '.log')
>>> os.path.splitext(os.path.basename("/var/log/err.log"))[0]
'err'
>>>