web-dev-qa-db-fra.com

Comment obtenir le nom de fichier sans l'extension à partir d'un chemin en Python?

Comment obtenir le nom de fichier sans l'extension à partir d'un chemin en Python?

821
Joan Venge

Obtenir le nom du fichier sans l'extension:

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

Impressions:

/path/to/some/file

Remarque importante: Si le nom du fichier comporte plusieurs points, seule l'extension qui suit le dernier est supprimée. Par exemple:

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

Impressions:

/path/to/some/file.txt.Zip

Voir les autres réponses ci-dessous si vous devez gérer ce cas.

1138
Geo

Vous pouvez créer le vôtre avec:

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

Remarque importante: S'il y a plus d'un . dans le nom du fichier, seul le dernier est supprimé. Par exemple:

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

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

Voir ci-dessous pour d'autres réponses à ce problème.

428
gimel
>>> print(os.path.splitext(os.path.basename("hemanth.txt"))[0])
hemanth
197
hemanth.hm

Une version lisible, utilisant Pathlib dans Python 3.4+

from pathlib import Path

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

Imprimera:

fichier

140
bold

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

from pathlib import Path

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

Si vous souhaitez conserver le chemin d'accès au fichier et simplement 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
25
user2902201

os.path.splitext () non fonctionne 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 simplement trouver l'index du premier point dans le nom de base puis trancher le nom de base pour obtenir uniquement le nom de 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
20

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

Dans python 3 pathlib "Le module pathlib propose des objets de chemin de haut niveau." alors,

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

@ IceAdor fait référence à rsplit dans un commentaire à la solution de @ user2902201. rsplit est la solution la plus simple prenant en charge plusieurs périodes.

Ici, il est précisé:

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

mon rapport

13
dlink

Je pensais introduire une variante de l’utilisation de os.path.splitext sans avoir à utiliser l’indexation par tableaux.

La fonction retourne toujours une paire (root, ext) afin que son utilisation soit sûre:

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

Mais même lorsque j'importe, je ne peux pas l'appeler path.basename. Est-il possible de l'appeler aussi directement que basename?

import os, puis utilisez os.path.basename

importing os ne signifie pas que vous pouvez utiliser os.foo sans vous référer à os.

12
Devin Jeanpierre

import os

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

Ceci retourne le filename sans le extension (C:\Utilisateurs\Public\Vidéos\Exemples de vidéos\Faune)

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

Maintenant, vous pouvez obtenir juste le filename du temp avec

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

Une procédure de prise en compte de plusieurs extensions. Fonctionne pour les chemins str et unicode. Fonctionne dans 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'
4
Lycan

Les autres méthodes ne suppriment pas plusieurs extensions. Certains ont aussi des problèmes avec les noms de fichiers qui n'ont pas d'extensions. Cet extrait traite les deux instances et fonctionne à la fois dans Python 2 et 3. Il extrait le nom de base du chemin, divise la valeur en points et renvoie la première, qui est la partie initiale du nom de fichier.

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

Voici une série d'exemples à exécuter:

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

Dans tous les cas, la valeur imprimée est:

FileName
3
Alan W. Smith

Sur le système Windows, j'ai également utilisé le préfixe nom_utilisateur, 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
Zéiksz
import os
path = "a/b/c/abc.txt"
print os.path.splitext(os.path.basename(path))[0]
2
user4949344

le moyen le plus simple de résoudre ce problème est de

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

cela vous fait économiser du temps et des coûts de calcul.

1
joseph nkoro

Pour l'ésotérique maximum:

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]

Remarque: ceci est juste pour le plaisir. Ne l'utilisez pas. Utilisez os.path.splitext à la place

1
Connor
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
shivendra singh

Nous pourrions faire un peu de split/pop magique comme on le voit ici ( https://stackoverflow.com/a/424006/1250044 ), pour extraire le nom de fichier (en respectant le différences entre 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
yckart

Pour plus de commodité, une simple fonction encapsulant 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
handle