如何在Python中从路径中获取没有扩展名的文件名?

1654

如何在Python中从路径中获取没有扩展名的文件名?

"/path/to/some/file.txt"  →  "file"

112
现代 Python 的正确答案是需要向下滚动一定的距离才能找到:from pathlib import Path; print(Path("/path/to/some/file.txt").stem) >>> file - BallpointBen
在这种情况下,您需要先解析出目录路径,然后再解析出没有扩展名的文件名。import os; filepath='./readme'; dir, filename_ext = os.path.split(filepath); filename=filename_ext.rsplit('.', maxsplit=1)[0]; print(f'{dir}/{filename}') ./readme - dlink
32个回答

25
import os
filename, file_extension =os.path.splitext(os.path.basename('/d1/d2/example.cs'))
  • 文件名为'example'

  • 文件扩展名为'.cs'

'

'

1
这实际上回答了提问者的问题。 - Fred

20
即使我导入 os,也无法直接调用它的 path.basename。是否可以像 basename 一样直接调用?
使用 import os,然后使用 os.path.basename
导入 os 并不意味着你可以在不引用 os 的情况下使用 os.foo

2
虽然如果你想直接调用foo,你可以使用from os import foo - tgray
1
如果 os 模块有一个叫做 foo 的成员,那么它的版本非常不标准。 - Tadhg McDonald-Jensen
3
这是一个占位符名称。(例如,考虑“path”或“walk”。) - Devin Jeanpierre

20

我想提供一种使用os.path.splitext的变化,无需使用数组索引。

该函数始终返回一个(根目录, 扩展名)对,因此可以安全使用:

root, ext = os.path.splitext(path)

例如:

>>> import os
>>> path = 'my_text_file.txt'
>>> root, ext = os.path.splitext(path)
>>> root
'my_text_file'
>>> ext
'.txt'

os.path.splittext() 是 3.6+ 版本的。 - Yzmir Ramirez

13

其他方法不能删除多个扩展名。有些方法也无法处理没有扩展名的文件名。这段代码可以同时解决这两种情况,并且可用于Python 2和3。它从路径中获取基本名称,将值按点号分割,并返回第一个值,即文件名的初始部分。

import os

def get_filename_without_extension(file_path):
    file_basename = os.path.basename(file_path)
    filename_without_extension = file_basename.split('.')[0]
    return filename_without_extension

这里是一组可供执行的例子:

example_paths = [
    "FileName", 
    "./FileName",
    "../../FileName",
    "FileName.txt", 
    "./FileName.txt.zip.asc",
    "/path/to/some/FileName",
    "/path/to/some/FileName.txt",
    "/path/to/some/FileName.txt.zip.asc"
]

for example_path in example_paths:
    print(get_filename_without_extension(example_path))

在每种情况下,打印的值都是:

FileName

除了处理多个点的附加值之外,这种方法比Path('/path/to/file.txt').stem快得多。(1.23微秒对比8.39微秒) - raratiru
这对于文件名nvdcve-1.1-2002.json.zip无效。 - Michele
我将其拆分为 fileBasename.split('.json')[0],并且它起作用了。 - Michele

6

一个支持多扩展名的过程。适用于 strunicode 路径。在 Python 2 和 3 中均可使用。

import os

def file_base_name(file_name):
    if '.' in file_name:
        separator_index = file_name.index('.')
        base_name = file_name[:separator_index]
        return base_name
    else:
        return file_name

def path_base_name(path):
    file_name = os.path.basename(path)
    return file_base_name(file_name)

行为:

>>> path_base_name('file')
'file'
>>> path_base_name(u'file')
u'file'
>>> path_base_name('file.txt')
'file'
>>> path_base_name(u'file.txt')
u'file'
>>> path_base_name('file.tar.gz')
'file'
>>> path_base_name('file.a.b.c.d.e.f.g')
'file'
>>> path_base_name('relative/path/file.ext')
'file'
>>> path_base_name('/absolute/path/file.ext')
'file'
>>> path_base_name('Relative\\Windows\\Path\\file.txt')
'file'
>>> path_base_name('C:\\Absolute\\Windows\\Path\\file.txt')
'file'
>>> path_base_name('/path with spaces/file.ext')
'file'
>>> path_base_name('C:\\Windows Path With Spaces\\file.txt')
'file'
>>> path_base_name('some/path/file name with spaces.tar.gz.zip.rar.7z')
'file name with spaces'

5
import os
path = "a/b/c/abc.txt"
print os.path.splitext(os.path.basename(path))[0]

5

非常简单,没有其他模块!!!

import os
p = r"C:\Users\bilal\Documents\face Recognition python\imgs\northon.jpg"

# Get the filename only from the initial file path.
filename = os.path.basename(p)

# Use splitext() to get filename and extension separately.
(file, ext) = os.path.splitext(filename)

# Print outcome.
print("Filename without extension =", file)
print("Extension =", ext)

5

导入 os 模块

filename = C:\\Users\\Public\\Videos\\Sample Videos\\wildlife.wmv

这将返回不带扩展名的文件名(C:\Users\Public\Videos\Sample Videos\wildlife)

temp = os.path.splitext(filename)[0]  

现在您可以通过以下方式从临时文件中获取文件名
os.path.basename(temp)   #this returns just the filename (wildlife)

3
使用 pathlib.Path.stem 是正确的方式,但是这里提供了一个丑陋但比基于 pathlib 的方法更高效的解决方案。
您有一个文件路径,其字段由斜杠 / 分隔,文件名中不能出现斜杠,因此您通过 / 分割文件路径,最后一个字段是文件名。
扩展名始终是通过将文件名按点 . 分割创建列表的最后一个元素,因此如果反转文件名并按点分割一次,则第二个元素的反转就是没有扩展名的文件名。
name = path.split('/')[-1][::-1].split('.', 1)[1][::-1]

性能:

Python 3.9.10 (tags/v3.9.10:f2f3f53, Jan 17 2022, 15:14:21) [MSC v.1929 64 bit (AMD64)]
Type 'copyright', 'credits' or 'license' for more information
IPython 7.28.0 -- An enhanced Interactive Python. Type '?' for help.

In [1]: from pathlib import Path

In [2]: file = 'D:/ffmpeg/ffmpeg.exe'

In [3]: Path(file).stem
Out[3]: 'ffmpeg'

In [4]: file.split('/')[-1][::-1].split('.', 1)[1][::-1]
Out[4]: 'ffmpeg'

In [5]: %timeit Path(file).stem
6.15 µs ± 433 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

In [6]: %timeit file.split('/')[-1][::-1].split('.', 1)[1][::-1]
671 ns ± 37.8 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

In [7]:

3
在Windows系统上,我也使用驱动程序名称前缀,例如:
>>> s = 'c:\\temp\\akarmi.txt'
>>> print(os.path.splitext(s)[0])
c:\temp\akarmi

因为我不需要驱动器号或目录名称,所以我使用以下命令:
>>> print(os.path.splitext(os.path.basename(s))[0])
akarmi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接