Réponses:
Oui. Utilisation os.path.splitext
(voir la documentation Python 2.X ou la documentation Python 3.X ):
>>> import os
>>> filename, file_extension = os.path.splitext('/path/to/somefile.ext')
>>> filename
'/path/to/somefile'
>>> file_extension
'.ext'
Contrairement à la plupart des tentatives de fractionnement de chaînes manuelles, os.path.splitext
traitera correctement /a/b.c/d
comme n'ayant pas d'extension au lieu d'avoir une extension .c/d
, et il traitera .bashrc
comme n'ayant pas d'extension au lieu d'avoir une extension .bashrc
:
>>> os.path.splitext('/a/b.c/d')
('/a/b.c/d', '')
>>> os.path.splitext('.bashrc')
('.bashrc', '')
endswith()
plus portable et pythonique?
.asd
c'est vraiment l'extension !! Si vous y réfléchissez, foo.tar.gz
c'est un fichier compressé avec gzip ( .gz
) qui se trouve être un fichier tar ( .tar
). Mais c'est un fichier gzip en premier lieu. Je ne m'attendrais pas du tout à ce qu'il retourne la double extension.
splittext
. S'ils faisaient juste quelque chose pour signifier la rupture entre les parties de ce nom, il serait beaucoup plus facile de reconnaître que c'est splitExt
ou split_ext
. Je ne peux sûrement pas être la seule personne à avoir fait cette erreur?
os.path.splitext('somefile.ext')
=> ('somefile', '.ext')
. N'hésitez pas à fournir un exemple de compteur réel sans référencer une bibliothèque tierce.
import os.path
extension = os.path.splitext(filename)[1]
import os.path
au lieu de from os import path
?
from os import path
alors le nom path
est repris dans votre portée locale, aussi les autres personnes qui regardent le code peuvent ne pas savoir immédiatement que path est le chemin du module os. Où comme si vous l'utilisiez import os.path
le garde dans l' os
espace de noms et où que vous fassiez l'appel, les gens le savent immédiatement path()
depuis le os
module.
_, extension = os.path.splitext(filename)
est beaucoup plus jolie.
if check_for_gzip and os.path.splitext(filename)[1] == '.gz':
Nouveau dans la version 3.4.
import pathlib
print(pathlib.Path('yourPath.example').suffix) # '.example'
Je suis surpris que personne ne l'ait pathlib
encore mentionné , c'est pathlib
génial!
Si vous avez besoin de tous les suffixes (par exemple, si vous en avez un .tar.gz
), vous .suffixes
en retournerez une liste!
''.join(pathlib.Path('somedir/file.tar.gz').suffixes)
.suffixes[-2:]
pour vous assurer d'obtenir uniquement .tar.gz au maximum.
Une option peut être la séparation du point:
>>> filename = "example.jpeg"
>>> filename.split(".")[-1]
'jpeg'
Aucune erreur lorsque le fichier n'a pas d'extension:
>>> "filename".split(".")[-1]
'filename'
Mais vous devez faire attention:
>>> "png".split(".")[-1]
'png' # But file doesn't have an extension
"my.file.name.js".split('.') => ['my','file','name','js]
['file', 'tar', 'gz']
avec 'file.tar.gz'.split('.')
vs ['file.tar', 'gz']
avec 'file.tar.gz'.rsplit('.', 1)
. oui, ça pourrait l'être.
N'importe laquelle des solutions ci-dessus fonctionne, mais sur Linux, j'ai trouvé qu'il y a une nouvelle ligne à la fin de la chaîne d'extension qui empêchera les correspondances de réussir. Ajoutez la strip()
méthode à la fin. Par exemple:
import os.path
extension = os.path.splitext(filename)[1][1:].strip()
[1:]
à .splittext(filename)[1][1:]
-d. l'entrée) - merci d'avance
splittext()
Je l'ai compris moi-même: (contrairement à si vous divisez une chaîne en utilisant '.') Inclut le '.' caractère dans l'extension. L'additionnel [1:]
s'en débarrasse.
Avec splitext il y a des problèmes avec les fichiers à double extension (par exemple file.tar.gz
, file.tar.bz2
, etc ..)
>>> fileName, fileExtension = os.path.splitext('/path/to/somefile.tar.gz')
>>> fileExtension
'.gz'
mais devrait être: .tar.gz
Les solutions possibles sont ici
gunzip somefile.tar.gz
quel est le nom du fichier de sortie?
Bien qu'il s'agisse d'un sujet ancien, mais je me demande pourquoi il n'y a aucun mention d'une API très simple de python appelée rpartition dans ce cas:
pour obtenir l'extension d'un chemin absolu de fichier donné, vous pouvez simplement taper:
filepath.rpartition('.')[-1]
exemple:
path = '/home/jersey/remote/data/test.csv'
print path.rpartition('.')[-1]
vous donnera: 'csv'
("string before the right-most occurrence of the separator", "the separator itself", "the rest of the string")
. S'il n'y a pas de séparateur trouvé, le tuple retourné sera: ("", "", "the original string")
.
Surpris, cela n'a pas encore été mentionné:
import os
fn = '/some/path/a.tar.gz'
basename = os.path.basename(fn) # os independent
Out[] a.tar.gz
base = basename.split('.')[0]
Out[] a
ext = '.'.join(basename.split('.')[1:]) # <-- main part
# if you want a leading '.', and if no result `None`:
ext = '.' + ext if ext else None
Out[] .tar.gz
Avantages:
Comme fonction:
def get_extension(filename):
basename = os.path.basename(filename) # os independent
ext = '.'.join(basename.split('.')[1:])
return '.' + ext if ext else None
[-1]
ensuite.
Vous pouvez utiliser un split
sur filename
:
f_extns = filename.split(".")
print ("The extension of the file is : " + repr(f_extns[-1]))
Cela ne nécessite pas de bibliothèque supplémentaire
Il s'agit d'une technique de représentation directe des chaînes: je vois beaucoup de solutions mentionnées, mais je pense que la plupart envisagent le split. Split le fait cependant à chaque occurrence de "." . Ce que vous préférez, c'est la partition.
string = "folder/to_path/filename.ext"
extension = string.rpartition(".")[-1]
Une autre solution avec split droit:
# to get extension only
s = 'test.ext'
if '.' in s: ext = s.rsplit('.', 1)[1]
# or, to get file name and extension
def split_filepath(s):
"""
get filename and extension from filepath
filepath -> (filename, extension)
"""
if not '.' in s: return (s, '')
r = s.rsplit('.', 1)
return (r[0], r[1])
Un vrai one-liner, si vous aimez les regex. Et cela n'a pas d'importance même si vous avez des "." Supplémentaires. au milieu
import re
file_ext = re.search(r"\.([^.]+)$", filename).group(1)
Voir ici pour le résultat: Cliquez ici
Il s'agit de la méthode la plus simple pour obtenir à la fois le nom de fichier et l'extension en une seule ligne .
fName, ext = 'C:/folder name/Flower.jpeg'.split('/')[-1].split('.')
>>> print(fName)
Flower
>>> print(ext)
jpeg
Contrairement à d'autres solutions, vous n'avez pas besoin d'importer de package pour cela.
Pour les drôles ... il suffit de rassembler les extensions dans un dict et de les suivre toutes dans un dossier. Tirez ensuite les extensions que vous souhaitez.
import os
search = {}
for f in os.listdir(os.getcwd()):
fn, fe = os.path.splitext(f)
try:
search[fe].append(f)
except:
search[fe]=[f,]
extensions = ('.png','.jpg')
for ex in extensions:
found = search.get(ex,'')
if found:
print(found)
essaye ça:
files = ['file.jpeg','file.tar.gz','file.png','file.foo.bar','file.etc']
pen_ext = ['foo', 'tar', 'bar', 'etc']
for file in files: #1
if (file.split(".")[-2] in pen_ext): #2
ext = file.split(".")[-2]+"."+file.split(".")[-1]#3
else:
ext = file.split(".")[-1] #4
print (ext) #5
foo.tar
est un nom de fichier valide. Que se passe-t-il si je jette ça sur votre code? Et pour .bashrc
ou foo
? Il y a une fonction de bibliothèque pour cela pour une raison ...
# try this, it works for anything, any length of extension
# e.g www.google.com/downloads/file1.gz.rs -> .gz.rs
import os.path
class LinkChecker:
@staticmethod
def get_link_extension(link: str)->str:
if link is None or link == "":
return ""
else:
paths = os.path.splitext(link)
ext = paths[1]
new_link = paths[0]
if ext != "":
return LinkChecker.get_link_extension(new_link) + ext
else:
return ""
def NewFileName(fichier):
cpt = 0
fic , *ext = fichier.split('.')
ext = '.'.join(ext)
while os.path.isfile(fichier):
cpt += 1
fichier = '{0}-({1}).{2}'.format(fic, cpt, ext)
return fichier
name_only=file_name[:filename.index(".")
Cela vous donnera le nom du fichier jusqu'au premier ".", Qui serait le plus courant.
file.name.ext
basename
est un peu déroutante ici caros.path.basename("/path/to/somefile.ext")
reviendrait"somefile.ext"