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

时间:2009-03-24 16:41:03

标签: python string path

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

25 个答案:

答案 0 :(得分:1057)

获取没有扩展名的文件名称:

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

答案 1 :(得分:386)

滚动它:

>>> 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'

答案 2 :(得分:184)

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

答案 3 :(得分:43)

为了完整起见,这里是python 3.2 +的pathlib解决方案:

from pathlib import Path

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

答案 4 :(得分:24)

如果您想保留文件的路径,只需删除扩展程序

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

答案 5 :(得分:19)

如果扩展中有多个点,

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

答案 6 :(得分:16)

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

答案 7 :(得分:12)

  

但即使我导入操作系统,我也无法将其命名为path.basename。是否可以直接将其称为basename?

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

import os并不意味着您可以在不引用os.foo的情况下使用os

答案 8 :(得分:11)

@ IceAdor在对@ user2902201解决方案的评论中引用了rsplit。 rsplit是支持多个句点的最简单的解决方案。

这里拼写出来:

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

my.report

答案 9 :(得分:7)

两个或更少的扩展

如其他 Pathlib 答案的评论中所述,处理多个后缀可能很尴尬。使用 .with_suffix('').stem 处理两个或更少的后缀还不错。

from pathlib import Path

pth = Path('foo/bar/baz.baz/thefile.tar.gz')

fn = pth.with_suffix('').stem

print(fn)      # thefile

任意数量的扩展

如果可能有两个以上的扩展名,您可以使用循环来处理可能有 0、1 或许多后缀的一般情况。

pth = Path('foo/bar/baz/thefile.tar.gz.bz.7zip')

pth.name       # 'thefile.tar.gz.bz.7zip'
pth.suffixes   # ['.tar', '.gz', '.bz', '.7zip']

所以

fn = pth.name
for s in pth.suffixes:
    fn = fn.rsplit(s)[0]
    
print(fn)      # thefile

fnp = Path(pth.name)  
for _ in fnp.suffixes:
    fnp = fnp.with_suffix('')
    
print(fnp)     # thefile

注意这里的 fnp 是路径,而 fn 是字符串,这可能决定了首选的循环形式。

如果你知道第一个扩展名

例如,如果扩展名可以是 .tar.tar.gz.tar.gz.bz 等;您可以简单地 rsplit 已知扩展名并采用第一个元素:


pth = Path('foo/bar/baz.baz/thefile.tar.gz')

fn = pth.name.rsplit('.tar')[0]

print(fn)      # thefile

答案 10 :(得分:4)

import os

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

这会返回filename而不是extension(C:\ Users \ Public \ Videos \ Sample Videos \ wildlife)

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

现在你可以通过

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

答案 11 :(得分:4)

多重扩展感知程序。适用于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'

答案 12 :(得分:3)

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

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)

答案 13 :(得分:2)

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

答案 14 :(得分:2)

在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

答案 15 :(得分:2)

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

答案 16 :(得分:1)

我已经阅读了答案,我注意到有很多很好的解决方案。 因此,对于那些希望获得(名称或扩展名)的人,这里有另一种解决方案,使用 os module,这两种方法都支持具有多个扩展名的文件。

import os

def get_file_name(path):
    if not os.path.isdir(path):
        return os.path.splitext(os.path.basename(path))[0].split(".")[0]


def get_file_extension(path):
    extensions = []
    copy_path = path
    while True:
        copy_path, result = os.path.splitext(copy_path)
        if result != '':
            extensions.append(result)
        else:
            break
    extensions.reverse()
    return "".join(extensions)

注意:windows上的这个解决方案不支持带有“\”字符的文件名

答案 17 :(得分:1)

我看上去并不难,但是我没有看到有人使用正则表达式解决这个问题。

我将问题解释为“给出路径,返回不带扩展名的基本名称。”

例如

"path/to/file.json" => "file"

"path/to/my.file.json" => "my.file"

在Python 2.7中,我们仍然没有pathlib ...

def get_file_name_prefix(file_path):
    basename = os.path.basename(file_path)

    file_name_prefix_match = re.compile(r"^(?P<file_name_pre fix>.*)\..*$").match(basename)

    if file_name_prefix_match is None:
        return file_name
    else:
        return file_name_prefix_match.group("file_name_prefix")
get_file_name_prefix("path/to/file.json")
>> file

get_file_name_prefix("path/to/my.file.json")
>> my.file

get_file_name_prefix("path/to/no_extension")
>> no_extension

答案 18 :(得分:1)

要获得最大的esoterica:

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

答案 19 :(得分:1)

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

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

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

答案 20 :(得分: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

答案 21 :(得分: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

答案 22 :(得分: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进行测试。

答案 23 :(得分:0)

改进@spinup 答案:

fn = pth.name
for s in pth.suffixes:
    fn = fn.rsplit(s)[0]
    break
    
print(fn)      # thefile 

这也适用于没有扩展名的文件名

答案 24 :(得分:-3)

导入操作系统 文件名,file_extension = os.path.splitext('/ d1 / d2 / example.cs') 文件名是'/ d1 / d2 / example' file_extension为“ .cs”