Come posso controllare l'estensione di un file?


179

Sto lavorando a un determinato programma in cui devo fare cose diverse a seconda dell'estensione del file. Potrei semplicemente usare questo?

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

usa il modulo python re (regex) per la corrispondenza
kefeizhou

21
@kefeizhou: Oh dio no, non per partite semplici.
orlp,

Risposte:


384

Supponendo che msia una stringa, puoi usare endswith:

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

Per non distinguere tra maiuscole e minuscole e per eliminare una catena altrimenti-if potenzialmente grande:

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

2
ext = m.rpartition ('.') [- 1]; se ext == sarà molto più efficiente
vulcano

1
@WilhelmMurdoch non ho quasi visto il tuo commento, felice di averlo fatto.
Flaudre,

@volcano perché non usarlo .split('.')[-1]? O la ripartizione è davvero ad alta efficienza?
Scott Anderson,

55

os.pathfornisce molte funzioni per manipolare percorsi / nomi di file. ( documenti )

os.path.splitext prende un percorso e divide l'estensione del file dalla fine di esso.

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

dà:

/folder/soundfile.mp3 è un mp3!
folder1 / folder / soundfile.flac è un file flac!

Questo metodo ignora i periodi iniziali, quindi /.mp3non è considerato un file mp3. Questo è tuttavia il modo in cui uno spazio guida dovrebbe essere trattato. Ad esempio, .gitignorenon è un formato di file
kon psych

24

Utilizzare pathlibda Python3.4 in poi.

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

1
Questa è la soluzione migliore
può

17

Guarda il modulo fnmatch. Questo farà quello che stai cercando di fare.

import fnmatch
import os

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

7

un modo semplice potrebbe essere:

import os

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

os.path.splitext(file)restituirà una tupla con due valori (il nome file senza estensione + solo l'estensione). Il secondo indice ([1]) fornirà quindi solo l'estensione. Il bello è che in questo modo puoi anche accedere facilmente al nome del file, se necessario!


6

o forse:

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

4

Un vecchio thread, ma può aiutare i futuri lettori ...

Vorrei evitare di utilizzare .lower () su nomi di file se non altro per rendere il codice più indipendente dalla piattaforma. (Linux fa distinzione tra maiuscole e minuscole, .lower () su un nome file sicuramente corromperà la tua logica alla fine ... o peggio, un file importante!)

Perché non usare re ? (Anche se per essere ancora più robusto, dovresti controllare l'intestazione del file magico di ogni file ... Come controllare il tipo di file senza estensioni in 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)) 

Produzione:

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
Questo non funziona per i file che contengono più .s, per esempiosome.test.file.mp3
Nick

3
Potresti fare [-1] per catturare quel caso limite.
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'

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.