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?
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"))
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'
>>> print os.path.splitext(os.path.basename("hemanth.txt"))[0]
hemanth
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
par souci d'exhaustivité, voici la solution pathlib
pour python 3.2+:
from pathlib import Path
print(Path(your_path).resolve().stem)
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
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
.
@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
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'
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)
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'
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
import os
path = "a/b/c/abc.txt"
print os.path.splitext(os.path.basename(path))[0]
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
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
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.
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
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.