Bir dosyanın uzantısını nasıl kontrol edebilirim?


179

Dosyanın uzantısına bağlı olarak farklı şeyler yapmam gereken belirli bir program üzerinde çalışıyorum. Bunu sadece kullanabilir miyim?

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

eşleştirme için python re modülünü (regex) kullanın
kefeizhou

21
@kefeizhou: Oh tanrım hayır, basit eşleşmeler için değil.
orlp

Yanıtlar:


385

mBir dize olduğunu varsayarak şunları kullanabilirsiniz endswith:

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

Büyük / küçük harfe duyarsız olmak ve büyük olasılıkla büyük olan bir zinciri ortadan kaldırmak için:

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

2
ext = m. bölüm ('.') [- 1]; ext == çok daha verimli olacaksa
volkan

1
@WilhelmMurdoch neredeyse yorumunuzu görmedim, sevindim.
Flaudre

@volcano neden kullanılmıyor .split('.')[-1]? Yoksa bölüm gerçekten yüksek verimlilik mi?
Scott Anderson

55

os.pathyolları / dosya adlarını değiştirmek için birçok işlev sağlar. ( dokümanlar )

os.path.splitext bir yol alır ve dosya uzantısını sonuna kadar böler.

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

verir:

/klasor/soundfile.mp3 bir mp3!
folder1 / folder / soundfile.flac bir flac dosyasıdır!

Bu yöntem önde gelen dönemleri yok sayar /.mp3, bu nedenle mp3 dosyası olarak kabul edilmez. Ancak bu, önde gelen bir boşluğun tedavi edilmesi gereken yoldur. Örneğin .gitignorebir dosya biçimi değildir
kon psikiyatri

25

pathlibPython3.4'ten itibaren kullanın .

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

1
Bu en iyi çözümdür
verebilir

17

Module fnmatch dosyasına bakın. Yapmaya çalıştığınız şey bu olacak.

import fnmatch
import os

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

7

kolay bir yol olabilir:

import os

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

os.path.splitext(file)iki değere sahip bir demet döndürür (uzantısız dosya adı + yalnızca uzantı). İkinci indeks ([1]) size sadece dahili numarayı verecektir. Güzel olan şey, bu şekilde dosya adına da gerekirse kolayca erişebilirsiniz!


6

ya da belki:

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

4

Eski bir ileti dizisi, ancak gelecekteki okuyuculara yardımcı olabilir ...

Ben ediyorum önlemek kullanarak ) (.lower kodunuzu daha platform bağımsız hale etmekten başka bir nedenden dolayı eğer dosya adları üzerinde. (linux büyük / küçük harfe duyarlıdır, bir dosya adındaki .lower () mutlaka mantığınızı bozacaktır ... ya da daha kötüsü önemli bir dosya!)

Neden re kullanmıyorsunuz ? (Daha sağlam olmasına rağmen, her dosyanın sihirli dosya başlığını kontrol etmelisiniz ... Python'da uzantısız dosya türü nasıl kontrol edilir? )

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

Çıktı:

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
Bu, birden çok .s içeren dosyalar için çalışmaz , örneğinsome.test.file.mp3
Nick

3
Bu kenar durumunu yakalamak için [-1] yapabilirsiniz.
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'

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.