Comment obtenir le nom de fichier sans l'extension à partir d'un chemin en Python?
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.
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.
>>> print(os.path.splitext(os.path.basename("hemanth.txt"))[0])
hemanth
Une version lisible, utilisant Pathlib
dans Python 3.4+
from pathlib import Path
Path('/root/dir/sub/file.ext').stem
Imprimera:
fichier
Par souci d'exhaustivité, voici la solution pathlib
pour python 3.2+:
from pathlib import Path
print(Path(your_path).resolve().stem)
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
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
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
@ 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
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'
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
import
ing os
ne signifie pas que vous pouvez utiliser os.foo
sans vous référer à os
.
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)
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'
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
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
import os
path = "a/b/c/abc.txt"
print os.path.splitext(os.path.basename(path))[0]
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.
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
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
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
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.