Jak mogę sprawdzić rozszerzenie pliku?

178

Pracuję nad pewnym programem, w którym muszę robić różne rzeczy w zależności od rozszerzenia pliku. Czy mogę po prostu tego użyć?

if m == *.mp3
   ...
elif m == *.flac
   ...
wkoomson
źródło
użyj modułu python re (regex) do dopasowania
kefeizhou
21
@kefeizhou: O Boże nie, nie do prostych dopasowań.
orlp

Odpowiedzi:

383

Zakładając, że mjest to ciąg, możesz użyć endswith:

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

Aby nie rozróżniać wielkości liter i wyeliminować potencjalnie duży łańcuch else-if:

m.lower().endswith(('.png', '.jpg', '.jpeg'))
lafras
źródło
2
ext = m.rpartition („.”) [- 1]; jeśli ext == będzie znacznie wydajniejszy
wulkan
1
@WilhelmMurdoch Prawie nie widziałem twojego komentarza, cieszę się, że to zrobiłem.
Flaudre
@volcano, dlaczego nie użyć .split('.')[-1]? A może rpartition to naprawdę wysoka wydajność?
Scott Anderson
55

os.pathudostępnia wiele funkcji do manipulowania ścieżkami / nazwami plików. ( dokumenty )

os.path.splitext pobiera ścieżkę i oddziela rozszerzenie pliku od jej końca.

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

Daje:

/folder/soundfile.mp3 to plik mp3!
folder1 / folder / soundfile.flac to plik flac!
Żołądź
źródło
Ta metoda ignoruje początkowe kropki, więc /.mp3nie jest uważana za plik mp3. W ten sposób należy jednak traktować przestrzeń wiodącą. Np. .gitignoreNie jest to format pliku
kon psych
24

Użyj pathlibod Python 3.4.

from pathlib import Path
Path('my_file.mp3').suffix == '.mp3'
Greg
źródło
1
Jest to najlepsze rozwiązanie
może
17

Spójrz na moduł fnmatch. To zrobi to, co próbujesz zrobić.

import fnmatch
import os

for file in os.listdir('.'):
    if fnmatch.fnmatch(file, '*.txt'):
        print file
John Gaines Jr.
źródło
7

jednym prostym sposobem może być:

import os

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

os.path.splitext(file)zwróci krotkę z dwiema wartościami (nazwa pliku bez rozszerzenia + tylko rozszerzenie). Drugi indeks ([1]) da więc tylko rozszerzenie. Fajne jest to, że w ten sposób w razie potrzeby możesz również łatwo uzyskać dostęp do nazwy pliku!

ulepszony
źródło
6

a może:

from glob import glob
...
for files in glob('path/*.mp3'): 
  do something
for files in glob('path/*.flac'): 
  do something else
phynfo
źródło
4

Stary wątek, ale może pomóc przyszłym czytelnikom ...

Chciałbym uniknąć stosując .lower () na nazwy plików, jeśli nie z innego powodu, niż uczynić kod bardziej niezależne od platformy. (linux jest przypadek wyczulona, .lower () w pliku na pewno uszkodzona logika ostatecznie ... lub, co gorsza, ważnym pliku!)

Dlaczego nie użyć ponownie ? (Chociaż aby być jeszcze bardziej niezawodnym, powinieneś sprawdzić magiczny nagłówek każdego pliku ... Jak sprawdzić typ plików bez rozszerzeń w Pythonie? )

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)) 

Wynik:

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.
źródło
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
źródło
2
if (file.split(".")[1] == "mp3"):
    print "its mp3"
elif (file.split(".")[1] == "flac"):
    print "its flac"
else:
    print "not compat"
Christian Papathanasiou
źródło
3
To nie zadziała w przypadku plików zawierających wiele plików ., na przykładsome.test.file.mp3
Nick,
3
Możesz zrobić [-1], aby uchwycić ten skrajny przypadek.
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
źródło
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
źródło
5
Opisz coś o swojej odpowiedzi, co pomoże innym łatwo ją zrozumieć, odnieś się do stackoverflow.com/help/how-to-answer
Angel F Syrus