web-dev-qa-db-fra.com

Vérifier si la chaîne se termine par l'une des chaînes d'une liste

Quelle est la manière pythonique d'écrire le code suivant?

extensions = ['.mp3','.avi']
file_name = 'test.mp3'

for extension in extensions:
    if file_name.endswith(extension):
        #do stuff

J'ai un vague souvenir que la déclaration explicite de la boucle for peut être évitée et écrite dans la condition if Est-ce vrai?

184

Bien que peu connu, str.endswith accepte également un tuple. Vous n'avez pas besoin de faire une boucle.

>>> 'test.mp3'.endswith(('.mp3', '.avi'))
True
364
falsetru

Il suffit d'utiliser:

if file_name.endswith(Tuple(extensions)):
38
Jon Clements

Prenez une extension du fichier et voyez si elle se trouve dans l'ensemble des extensions:

>>> import os
>>> extensions = set(['.mp3','.avi'])
>>> file_name = 'test.mp3'
>>> extension = os.path.splitext(file_name)[1]
>>> extension in extensions
True

Utiliser un ensemble car la complexité temporelle des recherches dans les ensembles est O(1) ( docs ).

5
alecxe

Il y a deux manières: les expressions régulières et les méthodes string (str). 

Les méthodes de chaîne sont généralement plus rapides (~ 2x).

import re, timeit
p = re.compile('.*(.mp3|.avi)$', re.IGNORECASE)
file_name = 'test.mp3'
print(bool(t.match(file_name))
%timeit bool(t.match(file_name)

792 ns ± 1,83 ns par boucle (moyenne ± dév. Standard de 7 essais, 1 000 boucles chacun)

file_name = 'test.mp3'
extensions = ('.mp3','.avi')
print(file_name.lower().endswith(extensions))
%timeit file_name.lower().endswith(extensions)

274 ns ± 4,22 ns par boucle (moyenne ± dév. Standard de 7 essais, 1 000 boucles chacun)

3
Igor A

Une autre possibilité pourrait être d'utiliser l'instruction IN:

extensions = ['.mp3','.avi']
file_name  = 'test.mp3'
if "." in file_name and file_name[file_name.rindex("."):] in extensions:
    print(True)
0
NeverHopeless

une autre façon qui peut renvoyer la liste des chaînes correspondantes est 

sample = "alexis has the control"
matched_strings = filter(sample.endswith, ["trol", "ol", "troll"])
print matched_strings
['trol', 'ol']
0
Akash Singh

Je viens de découvrir cela en cherchant autre chose. 

Je recommanderais d'utiliser les méthodes du package os. C'est parce que vous pouvez le rendre plus général, en compensant les cas étranges. 

Vous pouvez faire quelque chose comme: 

import os

the_file = 'aaaa/bbbb/ccc.ddd'

extensions_list = ['ddd', 'eee', 'fff']

if os.path.splitext(the_file)[-1] in extensions_list:
    # Do your thing.
0
Xxxo

J'ai ceci:

def has_extension(filename, extension):

    ext = "." + extension
    if filename.endswith(ext):
        return True
    else:
        return False
0
Thomas Wouters