¿Cómo puedo verificar la extensión de un archivo?


179

Estoy trabajando en cierto programa donde necesito hacer cosas diferentes dependiendo de la extensión del archivo. ¿Podría usar esto?

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

módulo de uso pitón re (expresiones regulares) para la coincidencia
kefeizhou

21
@kefeizhou: Oh dios no, no para partidos simples.
orlp 05 de

Respuestas:


384

Suponiendo que mes una cadena, puede usar endswith:

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

Para ser insensible a mayúsculas y minúsculas y para eliminar una cadena potencialmente grande si no:

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

2
ext = m.rpartition ('.') [- 1]; si ext == será mucho más eficiente
volcán

1
@WilhelmMurdoch casi no vi tu comentario, me alegro de haberlo hecho.
Flaudre

@volcano ¿por qué no usar .split('.')[-1]? ¿O es la partición realmente alta eficiencia?
Scott Anderson

55

os.pathproporciona muchas funciones para manipular rutas / nombres de archivo. ( documentos )

os.path.splitext toma una ruta y divide la extensión del archivo desde el final.

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."

Da:

/folder/soundfile.mp3 es un mp3!
folder1 / folder / soundfile.flac es un archivo flac!

Este método ignora los períodos iniciales, por /.mp3lo que no se considera un archivo mp3. Sin embargo, esta es la forma en que se debe tratar un espacio principal. Por ejemplo, .gitignoreno es un formato de archivo
kon psych

24

Usar pathlibdesde Python3.4 en adelante.

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

1
Esta es la mejor solución
mayo

17

Mira el módulo fnmatch. Eso hará lo que intentas hacer.

import fnmatch
import os

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

7

Una manera fácil podría ser:

import os

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

os.path.splitext(file)devolverá una tupla con dos valores (el nombre del archivo sin extensión + solo la extensión). El segundo índice ([1]) le proporcionará solo la extensión. Lo bueno es que de esta manera también puedes acceder al nombre de archivo con bastante facilidad, si es necesario.


6

o quizás:

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

4

Un hilo viejo, pero puede ayudar a futuros lectores ...

Me gustaría evitar el uso de .lower () en los nombres de archivo si no por otra razón que la de hacer que el código sea más independiente de la plataforma. (Linux es sensible a mayúsculas y minúsculas, .lower () en un nombre de archivo seguramente corromperá su lógica eventualmente ... o peor, ¡un archivo importante!)

¿Por qué no usar re ? (Aunque para ser aún más robusto, debe verificar el encabezado del archivo mágico de cada archivo ... ¿Cómo verificar el tipo de archivos sin extensiones 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)) 

Salida:

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
Esto no funcionará para archivos que contienen múltiples .some.test.file.mp3
Nick

3
Puede hacer [-1] para capturar ese caso límite.
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'

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.