如何从Python路径中获取不带扩展名的文件名?


Answers:


1314

获取不带扩展名的文件名:

import os
print(os.path.splitext("/path/to/some/file.txt")[0])

印刷品:

/path/to/some/file

的文档os.path.splitext

重要说明:如果文件名有多个点,则仅删除最后一个扩展名之后的扩展名。例如:

import os
print(os.path.splitext("/path/to/some/file.txt.zip.asc")[0])

印刷品:

/path/to/some/file.txt.zip

如果您需要处理这种情况,请参见下面的其他答案。


13
如果这是足够常见的操作,也许应该值得它作为自己的官方命令?类似于os.path.filename(path_to_file)而不是os.path.splitext(os.path.basename(path_to_file))[0]
2014年

19
如果文件名包含多个点怎么办?
matteok

100
对于想与matteok一样的人,如果有多个点,splitext会在最后一个点拆分(因此splitext('kitty.jpg.zip')给出('kitty.jpg', '.zip'))。
Chuck

50
请注意,此代码返回完整的文件路径(不带扩展名),而不仅仅是文件
阿兰·菲

2
是啊,所以你必须做的splitext(basename('/some/path/to/file.txt'))[0](我总是似乎在做)
CpILL

531

您可以使用以下方法制作自己的:

>>> import os
>>> base=os.path.basename('/root/dir/sub/file.ext')
>>> base
'file.ext'
>>> os.path.splitext(base)
('file', '.ext')
>>> os.path.splitext(base)[0]
'file'

重要说明:如果.文件名中有多个,则仅删除最后一个。例如:

/root/dir/sub/file.ext.zip -> file.ext

/root/dir/sub/file.ext.tar.gz -> file.ext.tar

请参阅下面的其他答案。


2
@ScottWilson:不过您仍然必须导入os
LarsH 2014年

35
“滚动”是什么意思?
LarsH 2014年

49
它是“自己动手制作”的缩写,意思是在美国英语中“自己动手制作”。
斯科特·C·威尔逊,

1
@艾伦·史密斯(Alan W. Smith),“顺其自然:”在过去的10年中运行得非常好。“少美国人”是什么意思?我不赞成你的修改。
Logic1

4
编辑使之更加清晰。并非每个人都以英语为第一语言,所以说“滚动”之类的话可能会增加混乱
nxmohamad

327

使用pathlib在Python 3.4+

from pathlib import Path

Path('/root/dir/sub/file.ext').stem

将返回

'file'

9
从python 3开始,这是推荐的方法
。– Miladiouss

1
请注意,像os.path解决方案一样,这只会剥离一个扩展名(或suffix称为扩展名pathlib)。Path('a.b.c').stem == 'a.b'
圆珠笔

@BallpointBen去除多个后缀的最佳方法是什么?当然,必须有比一个更好的办法Path(Path('a.b.c').stem).stem

1
@hoan我认为反复打电话.with_suffix('')是必经之路。您可能要循环播放直到p.suffix == ''
BallpointBen

218
>>> print(os.path.splitext(os.path.basename("hemanth.txt"))[0])
hemanth

7
为此+1。3个完全相同的答案,但这是最直接的答案。您可能只是用来`显示代码,并且将“ /somepath/hermanth.txt”用作路径实例。
cregox

2
@ hemanth.hm注意,在您提供的此语句中,os.path.basename没有必要。os.path.basename应该仅用于从文件路径获取文件名。
arrt_

74

在Python 3.4+中,您可以使用pathlib解决方案

from pathlib import Path

print(Path(your_path).resolve().stem)

4
你为什么resolve()走这条路?是否真的有可能获得文件的路径,而没有文件名而不是文件路径呢?这意味着,如果您提供符号链接的路径,则将返回符号链接指向的文件的文件名(不带扩展名)。
鲍里斯(Boris)

1
使用的一种可能原因resolve()是帮助解决多点问题。如果路径为“ ./foo.tar.gz”,则以下有关使用索引的答案将不起作用
William Allcock

30

https://docs.python.org/3/library/os.path.html

在python 3 pathlib中,“ pathlib模块提供了高级路径对象。” 所以,

>>> from pathlib import Path
>>> p = Path("/a/b/c.txt")
>>> print(p.with_suffix(''))
\a\b\c
>>> print(p.stem)
c

1
对于从完整路径中删除扩展名的一般情况,这是最好的python 3解决方案。使用茎还可以删除父路径。如果您希望使用双扩展名(例如bla.tar.gz),则可以使用两次:p.with_suffix('')。with_suffix('')。
Eelco van Vliet

24

如果您想保留文件的路径,然后删除扩展名

>>> file = '/root/dir/sub.exten/file.data.1.2.dat'
>>> print ('.').join(file.split('.')[:-1])
/root/dir/sub.exten/file.data.1.2

16
如果要在最后一个期间分割,请使用rsplit:'/root/dir/sub.exten/file.data.1.2.dat'.rsplit('.', 1)
IceArdor 2014年

21

如果扩展名中包含多个点,则os.path.splitext()不起作用。

例如images.tar.gz

>>> import os
>>> file_path = '/home/dc/images.tar.gz'
>>> file_name = os.path.basename(file_path)
>>> print os.path.splitext(file_name)[0]
images.tar

您可以只在基本名称中找到第一个点的索引,然后对基本名称进行切片以仅获取不带扩展名的文件名。

>>> import os
>>> file_path = '/home/dc/images.tar.gz'
>>> file_name = os.path.basename(file_path)
>>> index_of_dot = file_name.index('.')
>>> file_name_without_extension = file_name[:index_of_dot]
>>> print file_name_without_extension
images

1
index_of_dot = file_name.index('。')这将在获取文件的基本名称之后完成,以便它不会在.env处拆分
Dheeraj Chakravarthi'Oct

2
重要的一点是,像这样的一系列扩展很常见。.tar.gz .tar.bz .tar.7z

2
请注意,'haystack'.index('needle')如果.在干草堆中找不到针(在上述情况下为圆点,),则会引发ValueError异常。也没有任何扩展名的文件。
捷克学'18

15

@IceAdor引用了@ user2902201解决方案的注释中的rsplit。rsplit是支持多个期间的最简单的解决方案。

在这里说明:

file = 'my.report.txt'
print file.rsplit('.', 1)[0]

我的报告


13

但是即使导入os,也无法将其称为path.basename。是否可以直接将其作为基名来调用?

import os,然后使用 os.path.basename

importing os并不意味着您os.foo无需参考即可使用os


1
但是,如果您想直接调用foo,则可以使用from os import foo
tgray

os如果该模块具有名为的成员,则您具有该模块的非标准版本foo
塔德格·麦克唐纳

2
这是一个占位符名称。(例如,考虑pathwalk)。
Devin Jeanpierre

13

我以为我会使用os.path.splitext的变体不需要使用数组索引的情况的使用进行修改。

该函数始终返回一(root, ext)对,因此可以安全使用:

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

6

其他方法不会删除多个扩展名。有些文件名也没有扩展名。此代码段同时处理这两个实例,并且在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μs与8.39μs)
raratiru

这对文件名nvdcve-1.1-2002.json.zip不起作用
Michele

我在fileBasename.split('。json')[0]上拆分了它,并起作用了
Michele

4

import os

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

这将返回filenameextension(C:\用户\公用\视频\样品影片\野生动物)

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

现在,您可以filename通过

os.path.basename(temp)   #this returns just the filename (wildlife)

3

多扩展识别过程。适用于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'

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

0

在Windows系统上,我也使用drivername前缀,例如:

>>> s = 'c:\\temp\\akarmi.txt'
>>> print(os.path.splitext(s)[0])
c:\temp\akarmi

因此,由于不需要驱动器号或目录名,因此使用:

>>> print(os.path.splitext(os.path.basename(s))[0])
akarmi

0

为了方便起见,一个简单的函数包装了以下两种方法os.path

def filename(path):
  """Return file name without extension from path.

  See https://docs.python.org/3/library/os.path.html
  """
  import os.path
  b = os.path.split(path)[1]  # path, *filename*
  f = os.path.splitext(b)[0]  # *file*, ext
  #print(path, b, f)
  return f

经过Python 3.5测试。


0

解决此问题的最简单方法是

import ntpath 
print('Base name is ',ntpath.basename('/path/to/the/file/'))

这样可以节省您的时间和计算成本。


0

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

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)

-1

我们可以做一些简单的split/ pop因为在这里看到(魔术https://stackoverflow.com/a/424006/1250044),提取文件名(尊重Windows和POSIX差异)。

def getFileNameWithoutExtension(path):
  return path.split('\\').pop().split('/').pop().rsplit('.', 1)[0]

getFileNameWithoutExtension('/path/to/file-0.0.1.ext')
# => file-0.0.1

getFileNameWithoutExtension('\\path\\to\\file-0.0.1.ext')
# => file-0.0.1

os.path.splitext()[0]做同样的事情。
查尔斯·普拉格

如果扩展名中包含多个点,则 @CharlesPlager os.path.splitext()将不起作用。stackoverflow.com/a/37760212/1250044
yckart

它对我有用:在[72]中:os.path.splitext('one.two.three.ext')Out [72]:('one.two.three','.ext')
Charles Plager

-1
import os
list = []
def getFileName( path ):
for file in os.listdir(path):
    #print file
    try:
        base=os.path.basename(file)
        splitbase=os.path.splitext(base)
        ext = os.path.splitext(base)[1]
        if(ext):
            list.append(base)
        else:
            newpath = path+"/"+file
            #print path
            getFileName(newpath)
    except:
        pass
return list

getFileName("/home/weexcel-java3/Desktop/backup")
print list

-3

import os文件名,file_extension = os.path.splitext('/ d1 / d2 / example.cs')文件名是'/ d1 / d2 / example'file_extension是'.cs'

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.