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

Joa*_*nge 872 python string path

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

Geo*_*Geo 1193

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

import os
print(os.path.splitext("/path/to/some/file.txt")[0])
Run Code Online (Sandbox Code Playgroud)

  • 对于任何想要和matteok一样的人,如果有多个点,splitext会在最后一个点分裂(所以`splitext('kitty.jpg.zip')`给`('kitty.jpg','.zip')`) . (97认同)
  • 请注意,此代码返回完整文件*path*(不带扩展名),而不仅仅是文件*name*. (40认同)
  • 如果文件名包含多个点怎么办? (17认同)
  • 是的,所以你必须做 `splitext(basename('/some/path/to/file.txt'))[0]` (我_总是_似乎在做) (14认同)
  • 如果这是一个足够普遍的操作,也许它应该值得它自己的官方命令?像os.path.filename(path_to_file)而不是os.path.splitext(os.path.basename(path_to_file))[0] (9认同)
  • 这不是正确的答案。使用 `os.path.splitext(os.path.basename(protocol))[0]` 或请参考@gimel (3认同)
  • 这不是答案,请使用 CplLL 的答案更新此答案,因为我们无法克服 1347 票!精氨酸 (2认同)
  • 这不是OP问题的答案! (2认同)

gim*_*mel 456

滚动吧:

>>> 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'
Run Code Online (Sandbox Code Playgroud)

  • 它是"滚动你自己"的缩写,意思是"用自己构建"美式英语. (47认同)
  • 什么'滚动'是什么意思? (32认同)
  • 这个答案应该有“绿色勾号” (10认同)
  • @ScottWilson:你仍然需要导入`os`. (2认同)

小智 206

>>> print(os.path.splitext(os.path.basename("hemanth.txt"))[0])
hemanth
Run Code Online (Sandbox Code Playgroud)

  • +1为此.3完全相同的答案,但这是最直接的答案.您可以使用`\``来显示代码,并使用"/somepath/hermanth.txt"作为路径实例. (7认同)
  • @ hemanth.hm注意,在您提供的此语句中,不需要os.path.basename。os.path.basename应该仅用于从文件路径获取文件名。 (2认同)

bol*_*old 183

可读版本,pathlib在Python 3.4+中使用

from pathlib import Path

Path('/root/dir/sub/file.ext').stem
Run Code Online (Sandbox Code Playgroud)

将打印:

文件

如果路径可以是符号链接,则添加pathlib

file
Run Code Online (Sandbox Code Playgroud)

  • 这是从 python 3 开始推荐的方式。 (43认同)
  • @pymen,这取决于您定义的“扩展”。《了不起的狐狸先生.mp4》怎么样? (8认同)
  • @hoan我认为反复调用 `.with_suffix('')` 是正确的方法。您可能想要循环直到`p.suffix == ''`。 (6认同)
  • 请注意,与“os.path”解决方案一样,这只会删除一个扩展名(或“后缀”,如“pathlib”所说)。`路径('abc').stem == 'ab'` (3认同)
  • 它不适用于具有复杂扩展名的文件: `pathlib.Path('backup.tar.gz').stem` -> `'backup.tar` 但预期是 `backup` (3认同)
  • @sh37211哦,我完全误解了你原来的问题。非常简单的解决方案: `Path(string).with_suffix('')` 应该可以解决问题。with_suffix() 将 Path 对象的后缀更改为传入的任何字符串,在本例中,我们传入一个空字符串以有效删除它。 (3认同)
  • @BallpointBen 去除多个后缀的最佳方法是什么?当然一定有比 `Path(Path('abc').stem).stem` 更好的方法 (2认同)
  • 如果需要带扩展名的文件名,请使用“name”而不是“stem”。 (2认同)

Mor*_*oth 57

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

from pathlib import Path

print(Path(your_path).resolve().stem)
Run Code Online (Sandbox Code Playgroud)

  • 为什么要 [`resolve()`](https://docs.python.org/library/pathlib.html#pathlib.Path.resolve) 路径?是否真的可以获取文件的路径并且不让文件名成为路径的一部分?这意味着,如果您给出符号链接的路径,您将返回符号链接指向的文件的文件名(不带扩展名)。 (6认同)
  • 使用“resolve()”的一个可能原因是帮助处理多点问题。如果路径是“./foo.tar.gz”,下面关于使用索引的答案将不起作用 (3认同)

小智 24

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

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

  • 如果你想在最后一个时期拆分,请使用rsplit:`'/ root/dir /sub.exten/file.data.1.2.dat'.rsplit('.',1)` (15认同)

jji*_*now 21

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
Run Code Online (Sandbox Code Playgroud)

  • 对于从完整路径中删除扩展名的一般情况,这是最佳的 python 3 解决方案。使用stem也会删除父路径。如果您期望使用双扩展名(例如 bla.tar.gz),那么您甚至可以使用它两次:p.with_suffix('').with_suffix('')。 (5认同)

Dhe*_*thi 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
Run Code Online (Sandbox Code Playgroud)

您可以在基本名称中找到第一个点的索引,然后将基本名称切片以仅获取没有扩展名的文件名.

>>> 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
Run Code Online (Sandbox Code Playgroud)

  • 请注意,如果在 haystack 中找不到针(在上述情况下为点,`.`),则 `'haystack'.index('needle')` 会抛出 ValueError 异常。没有任何扩展名的文件也存在。 (3认同)
  • 重要的一点是,像这样的一系列扩展很常见。`.tar.gz`.tar.bz`.tar.7z` (2认同)

Ala*_*ith 15

其他方法不会删除多个扩展名。有些还存在文件名没有扩展名的问题。这个片段处理这两个实例并且在 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
Run Code Online (Sandbox Code Playgroud)

下面是一组要运行的示例:

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))
Run Code Online (Sandbox Code Playgroud)

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

FileName
Run Code Online (Sandbox Code Playgroud)


dli*_*ink 12

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

这里拼写出来:

file = 'my.report.txt'
print file.rsplit('.', 1)[0]
Run Code Online (Sandbox Code Playgroud)

我的报告


Dev*_*rre 11

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

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

importing os并不意味着你可以在os.foo不参考的情况下使用os.

  • 但如果你想直接调用 foo ,你可以使用“from os import foo”。 (2认同)
  • 这是一个占位符名称。(例如,考虑“路径”或“步行”)。 (2认同)

Sco*_*McC 11

我以为我会在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'
Run Code Online (Sandbox Code Playgroud)


spi*_*nup 9

两个或更少的扩展

正如其他 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
Run Code Online (Sandbox Code Playgroud)

任意数量的扩展

如果可能有两个以上的扩展名,您可以使用循环来处理可能有 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']

Run Code Online (Sandbox Code Playgroud)

所以

fn = pth.name
for s in pth.suffixes:
    fn = fn.rsplit(s)[0]
    
print(fn)      # thefile
Run Code Online (Sandbox Code Playgroud)

或者

fnp = Path(pth.name)  
for _ in fnp.suffixes:
    fnp = fnp.with_suffix('')
    
print(fnp)     # thefile
Run Code Online (Sandbox Code Playgroud)

注意这里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
Run Code Online (Sandbox Code Playgroud)


小智 7

import os
filename, file_extension =os.path.splitext(os.path.basename('/d1/d2/example.cs'))
Run Code Online (Sandbox Code Playgroud)
  • 文件名是“示例”

  • file_extension 是“.cs”

'


lea*_*ode 6

import os

filename = C:\\Users\\Public\\Videos\\Sample Videos\\wildlife.wmv
Run Code Online (Sandbox Code Playgroud)

这将返回filename没有extension(C:\Users\Public\Videos\Sample Videos\wildlife)

temp = os.path.splitext(filename)[0]  
Run Code Online (Sandbox Code Playgroud)

现在你可以filename从 temp 中获得

os.path.basename(temp)   #this returns just the filename (wildlife)
Run Code Online (Sandbox Code Playgroud)


小智 5

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


小智 5

多扩展感知过程。适用于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)
Run Code Online (Sandbox Code Playgroud)

行为:

>>> 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'
Run Code Online (Sandbox Code Playgroud)


Bil*_*lal 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)
Run Code Online (Sandbox Code Playgroud)