关于字符串:如何从Python中的路径获取不带扩展名的文件名?

How to get the filename without the extension from a path in Python?

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


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

1
2
import os
print(os.path.splitext("path_to_file")[0])


只要滚动它:

1
2
3
4
5
6
7
8
>>> 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'


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


一个可读的版本,在python3.4中使用pathlib。+

1
2
3
from pathlib import Path

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

将打印:

file

如果路径可以是符号链接,则添加resolve()

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


为了完整起见,下面是针对python 3.2+的pathlib解决方案:

1
2
3
from pathlib import Path

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


如果要保留文件的路径并只删除扩展名

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


如果扩展名中有多个点,os.path.splitext()将无法工作。

例如,images.tar.gz

1
2
3
4
5
>>> 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

您可以在basename中找到第一个点的索引,然后对basename进行切片,得到不带扩展名的文件名。

1
2
3
4
5
6
7
>>> 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


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

在python3 pathlib中,"pathlib模块提供高级路径对象。"所以,

1
2
3
4
5
6
>>> from pathlib import Path
>>> p = Path("/a/b/c.txt")
>>> print(p.with_suffix(''))
\a\b\c
>>> print(p.stem)
c

But even when I import os, I am not able to call it path.basename. Is it possible to call it as directly as basename?

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

importing os并不意味着你可以不参考os而使用os.foo


@Iceador在对@user2902201解决方案的评论中提到了rsplit。rsplit是支持多个周期的最简单的解决方案。

这里写的是:

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

我的报告


我想我可以在不需要使用数组索引的情况下,对os.path.splitext的使用进行一个变更。

函数总是返回一个(root, ext)对,因此可以安全地使用:

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

例子:

1
2
3
4
5
6
7
>>> import os
>>> path = 'my_text_file.txt'
>>> root, ext = os.path.splitext(path)
>>> root
'my_text_file'
>>> ext
'.txt'

import os

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

这将返回不带extensionfilename(c:userspublicvideossample videoswidlife)

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

现在你只需从临时工那里得到一个filename

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

多扩展感知过程。适用于strunicode路径。在python2和3中工作。

1
2
3
4
5
6
7
8
9
10
11
12
13
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)

行为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
>>> 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
2
3
import os
path ="a/b/c/abc.txt"
print os.path.splitext(os.path.basename(path))[0]


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

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

因此,因为我不需要驱动器号或目录名,所以我使用:

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

我们可以做一些简单的split/pop魔术(https://stackoverflow.com/a/424006/1250044),以提取文件名(考虑到Windows和POSIX的不同)。

1
2
3
4
5
6
7
8
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


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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

解决这一问题的最简单方法是

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

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


对于最大的秘密:

1
2
3
4
5
6
7
8
9
def strip_suffix(filename):
   """
    >>> video.mp4
    video

    >>> video.extra.mp4
    video.extra
   """

    return ''.join((name_dot[0] + name_dot[1] for name_dot in itertools.zip_longest(filename.split('.')[0:-1], '.', fillvalue='.')))[0:-1]

注意:这只是为了好玩。不要使用这个。用os.path.splitext代替


为了方便起见,一个简单的函数包装了来自os.path的两个方法:

1
2
3
4
5
6
7
8
9
10
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测试。