Comment puis-je vérifier l'extension d'un fichier?


179

Je travaille sur un certain programme où je dois faire différentes choses en fonction de l'extension du fichier. Puis-je simplement utiliser ceci?

if m == *.mp3
   ...
elif m == *.flac
   ...

utiliser le module python re (regex) pour la correspondance
kefeizhou

21
@kefeizhou: Oh mon Dieu non, pas pour de simples matchs.
orlp

Réponses:


384

En supposant qu'il ms'agit d'une chaîne, vous pouvez utiliser endswith:

if m.endswith('.mp3'):
...
elif m.endswith('.flac'):
...

Pour être insensible à la casse et pour éliminer une chaîne else-if potentiellement importante:

m.lower().endswith(('.png', '.jpg', '.jpeg'))

2
ext = m.rpartition ('.') [- 1]; si ext == sera beaucoup plus efficace
volcan

1
@WilhelmMurdoch J'ai failli ne pas voir votre commentaire, content de l'avoir fait.
Flaudre

@volcano pourquoi ne pas l'utiliser .split('.')[-1]? Ou la répartition est-elle vraiment efficace?
Scott Anderson

55

os.pathfournit de nombreuses fonctions pour manipuler les chemins / noms de fichiers. ( docs )

os.path.splitext prend un chemin et divise l'extension de fichier à partir de la fin.

import os

filepaths = ["/folder/soundfile.mp3", "folder1/folder/soundfile.flac"]

for fp in filepaths:
    # Split the extension from the path and normalise it to lowercase.
    ext = os.path.splitext(fp)[-1].lower()

    # Now we can simply use == to check for equality, no need for wildcards.
    if ext == ".mp3":
        print fp, "is an mp3!"
    elif ext == ".flac":
        print fp, "is a flac file!"
    else:
        print fp, "is an unknown file format."

Donne:

/folder/soundfile.mp3 est un mp3!
folder1 / folder / soundfile.flac est un fichier flac!

Cette méthode ignore les périodes de début et /.mp3n'est donc pas considérée comme un fichier mp3. C'est cependant la manière dont un espace de premier plan doit être traité. Par exemple, ce .gitignoren'est pas un format de fichier
kon psych

24

Utilisez à pathlibpartir de Python3.4.

from pathlib import Path
Path('my_file.mp3').suffix == '.mp3'

1
C'est la meilleure solution
mai

17

Regardez le module fnmatch. Cela fera ce que vous essayez de faire.

import fnmatch
import os

for file in os.listdir('.'):
    if fnmatch.fnmatch(file, '*.txt'):
        print file

7

un moyen simple pourrait être:

import os

if os.path.splitext(file)[1] == ".mp3":
    # do something

os.path.splitext(file)renverra un tuple avec deux valeurs (le nom de fichier sans extension + juste l'extension). Le deuxième index ([1]) vous donnera donc juste l'extension. Ce qui est cool, c'est que de cette façon, vous pouvez également accéder au nom de fichier assez facilement, si nécessaire!


6

ou peut-être:

from glob import glob
...
for files in glob('path/*.mp3'): 
  do something
for files in glob('path/*.flac'): 
  do something else

4

Un vieux fil, mais qui peut aider les futurs lecteurs ...

J'éviter l' utilisation .lower () sur les noms de fichiers si pour aucune autre raison que de rendre votre code plus indépendant de la plate - forme. (Linux est sensible à la casse, .lower () sur un nom de fichier corrompra sûrement votre logique éventuellement ... ou pire, un fichier important!)

Pourquoi ne pas utiliser re ? (Bien que pour être encore plus robuste, vous devriez vérifier l'en-tête de fichier magique de chaque fichier ... Comment vérifier le type de fichiers sans extensions en python? )

import re

def checkext(fname):   
    if re.search('\.mp3$',fname,flags=re.IGNORECASE):
        return('mp3')
    if re.search('\.flac$',fname,flags=re.IGNORECASE):
        return('flac')
    return('skip')

flist = ['myfile.mp3', 'myfile.MP3','myfile.mP3','myfile.mp4','myfile.flack','myfile.FLAC',
     'myfile.Mov','myfile.fLaC']

for f in flist:
    print "{} ==> {}".format(f,checkext(f)) 

Production:

myfile.mp3 ==> mp3
myfile.MP3 ==> mp3
myfile.mP3 ==> mp3
myfile.mp4 ==> skip
myfile.flack ==> skip
myfile.FLAC ==> flac
myfile.Mov ==> skip
myfile.fLaC ==> flac

3
import os
source = ['test_sound.flac','ts.mp3']

for files in source:
   fileName,fileExtension = os.path.splitext(files)
   print fileExtension   # Print File Extensions
   print fileName   # It print file name

2
if (file.split(".")[1] == "mp3"):
    print "its mp3"
elif (file.split(".")[1] == "flac"):
    print "its flac"
else:
    print "not compat"

3
Cela ne fonctionnera pas pour les fichiers contenant plusieurs .s, par exemplesome.test.file.mp3
Nick

3
Vous pouvez faire [-1] pour capturer ce cas de bord.
Christian Papathanasiou

1
#!/usr/bin/python

import shutil, os

source = ['test_sound.flac','ts.mp3']

for files in source:
  fileName,fileExtension = os.path.splitext(files)

  if fileExtension==".flac" :
    print 'This file is flac file %s' %files
  elif  fileExtension==".mp3":
    print 'This file is mp3 file %s' %files
  else:
    print 'Format is not valid'

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.