¿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
   ...
wkoomson
fuente
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'))
lafras
fuente
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!
Bellota
fuente
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'
Greg
fuente
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
John Gaines Jr.
fuente
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.

upgrd
fuente
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
phynfo
fuente
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
Dan F.
fuente
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
fuente
2
if (file.split(".")[1] == "mp3"):
    print "its mp3"
elif (file.split(".")[1] == "flac"):
    print "its flac"
else:
    print "not compat"
Christian Papathanasiou
fuente
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'
nprak
fuente
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
fuente
55
Describa algo acerca de su respuesta que ayudará a otros a entender fácilmente, consulte stackoverflow.com/help/how-to-answer
Angel F Syrus