Comment obtenir le nom du fichier sans l'extension d'un chemin en Python?

Comment obtenir le nom du fichier sans l'extension d'un chemin en Python?

j'ai trouvé une méthode appelée os.path.basename pour obtenir le nom du fichier avec extension. Mais même quand j'importe os, Je ne suis pas en mesure de l'appeler path.basename . Est-il possible de l'appeler comme basename?

597
demandé sur Shai 2009-03-24 19:41:03

19 réponses

obtenir le nom du fichier sans l'extension:

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

quant à votre problème d'importation, vous le résolvez de cette façon:

from os.path import basename

# now you can call it directly with basename
print(basename("/a/b/c.txt"))
837
répondu Geo 2016-10-11 08:34:37

rouler:

>>> 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'
287
répondu gimel 2017-02-09 00:52:25
>>> print os.path.splitext(os.path.basename("hemanth.txt"))[0]
hemanth
144
répondu hemanth.hm 2010-06-23 10:17:04

une version lisible, utilisant Pathlib en Python 3.4+

from pathlib import Path

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

affichera:

fichier

si le chemin peut être un lien symbolique , alors ajouter resolve()

Path('/root/dir/sub/file.ext').resolve().stem
34
répondu bold 2017-11-26 13:48:33

par souci d'exhaustivité, voici la solution pathlib pour python 3.2+:

from pathlib import Path

print(Path(your_path).resolve().stem)
31
répondu Morgoth 2017-08-24 16:08:01

si vous voulez garder le chemin vers le fichier et juste supprimer l'extension

>>> file = '/root/dir/sub.exten/file.data.1.2.dat'
>>> print ('.').join(file.split('.')[:-1])
/root/dir/sub.exten/file.data.1.2
18
répondu 2013-10-21 07:46:11

os.chemin.splitext () ne fonctionnera pas s'il y a plusieurs points dans l'extension.

par exemple, 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

vous pouvez juste trouver l'index du premier point dans le basename et ensuite trancher le basename pour obtenir juste le nom du fichier sans extension.

>>> 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
12
répondu Dheeraj Chakravarthi 2016-10-05 04:24:26

mais même quand j'importe os, Je ne suis pas capable de l'appeler path.basename. Est-il possible de l'appeler comme basename?

import os , puis utiliser os.path.basename

import ing os ne signifie pas que vous pouvez utiliser os.foo sans faire référence à os .

11
répondu Devin Jeanpierre 2009-03-24 16:45:02

@Iceador's fait référence à rsplit dans un commentaire à la solution de @user2902201. rsplit est la solution la plus simple qui supporte plusieurs périodes.

ici, il est écrit:

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

mon.rapport

8
répondu dlink 2017-05-23 20:09:13

a pensé que je lancerais une variation à l'utilisation du os.chemin.splitext sans la nécessité d'utiliser l'indexation de tableaux.

la fonction renvoie toujours une paire (root, ext) de sorte qu'il est sûr à utiliser:

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

exemple:

>>> import os
>>> path = 'my_text_file.txt'
>>> root, ext = os.path.splitext(path)
>>> root
'my_text_file'
>>> ext
'.txt'
6
répondu ScottMcC 2018-02-27 07:41:35

import os

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

renvoie le filename sans le extension (C:\Users\Public\Videos\Sample vidéos \ faune)

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

Maintenant vous pouvez obtenir juste le filename de la temp avec

os.path.basename(temp)   #this returns just the filename (wildlife)
4
répondu learncode 2017-01-16 17:07:51

procédure d'extension multiple. Travaux pour str et unicode chemins. Fonctionne en Python 2 et 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)

Comportement:

>>> 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'
3
répondu Lycan 2017-10-18 13:15:08

sur le système de Windows j'ai utilisé le préfixe drivername ainsi, comme:

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

donc parce que je n'ai pas besoin de lettre de lecteur ou de nom de répertoire, j'utilise:

>>> print(os.path.splitext(os.path.basename(s))[0])
akarmi
2
répondu Zéiksz 2013-08-19 09:12:48
import os
path = "a/b/c/abc.txt"
print os.path.splitext(os.path.basename(path))[0]
2
répondu user4949344 2015-05-28 20:15:32

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

en Python 3 pathlib "le module pathlib offre des objets de chemin de haut niveau." so,

>>> from pathlib import Path
>>> p = Path("/a/b/c.txt")
>>> print(p.with_suffix(''))
\a\b\c
>>> print(p.stem)
c
2
répondu jjisnow 2018-07-23 09:20:15

nous pourrions faire quelques simples split / pop magie comme vu ici ( https://stackoverflow.com/a/424006/1250044 ), pour extraire le nom du fichier (en respectant les différences windows et 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
1
répondu yckart 2017-05-23 12:34:54

pour la commodité, une fonction simple enveloppant les deux méthodes de 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

Testé avec Python 3.5.

0
répondu handle 2016-09-22 20:23:28
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
0
répondu shivendra singh 2017-06-01 13:37:07

la façon la plus facile de résoudre ce problème est de

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

vous économisez du temps et des coûts de calcul.

0
répondu joseph nkoro 2017-10-24 01:51:55