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
   ...
wkoomson
la source
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'))
lafras
la source
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!
Gland
la source
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'
Greg
la source
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
John Gaines Jr.
la source
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!

upgrd
la source
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
phynfo
la source
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
Dan F.
la source
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
Rajan Mandanka
la source
2
if (file.split(".")[1] == "mp3"):
    print "its mp3"
elif (file.split(".")[1] == "flac"):
    print "its flac"
else:
    print "not compat"
Christian Papathanasiou
la source
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'
nprak
la source
0
file='test.xlsx'
if file.endswith('.csv'):
    print('file is CSV')
elif file.endswith('.xlsx'):
    print('file is excel')
else:
    print('none of them')
Anil Dubey
la source
5
Décrivez quelque chose à propos de votre réponse qui aidera les autres à comprendre facilement, reportez-vous à stackoverflow.com/help/how-to-answer
Angel F Syrus