Bagaimana saya bisa memeriksa ekstensi file?


178

Saya sedang mengerjakan program tertentu di mana saya perlu melakukan berbagai hal tergantung pada ekstensi file. Bisakah saya menggunakan ini?

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

gunakan python re module (regex) untuk pencocokan
kefeizhou

21
@kefeizhou: Ya Tuhan, tidak untuk pertandingan sederhana.
orlp

Jawaban:


383

Dengan asumsi mstring, Anda dapat menggunakan endswith:

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

Menjadi case-insensitive, dan untuk menghilangkan rantai besar lain-jika:

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

2
ext = m.rpartition ('.') [- 1]; jika ext == akan jauh lebih efisien
gunung berapi

1
@ WillhelmMurdoch saya hampir tidak melihat komentar Anda, senang saya lakukan.
Flaudre

@ gunung berapi mengapa tidak digunakan .split('.')[-1]? Atau rpartition benar-benar efisiensi yang tinggi?
Scott Anderson

55

os.pathmenyediakan banyak fungsi untuk memanipulasi path / nama file. ( dok )

os.path.splitext mengambil jalur dan memisahkan ekstensi file dari ujungnya.

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

Memberi:

/folder/soundfile.mp3 adalah mp3!
folder1 / folder / soundfile.flac adalah file flac!

Metode ini mengabaikan periode terkemuka sehingga /.mp3tidak dianggap sebagai file mp3. Namun ini adalah cara ruang terkemuka harus diperlakukan. Misalnya .gitignorebukan format file
kon psych

24

Gunakan pathlibDari Python3.4 dan seterusnya.

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

1
Ini adalah solusi terbaik
mungkin

17

Lihatlah modul fnmatch. Itu akan melakukan apa yang Anda coba lakukan.

import fnmatch
import os

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

7

salah satu cara mudah bisa:

import os

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

os.path.splitext(file)akan mengembalikan tuple dengan dua nilai (nama file tanpa ekstensi + hanya ekstensi). Indeks kedua ([1]) akan memberikan Anda hanya ekstensi. Yang keren adalah, dengan cara ini Anda juga dapat mengakses nama file dengan cukup mudah, jika perlu!


6

atau mungkin:

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

4

Utas lama, tetapi dapat membantu pembaca di masa mendatang ...

Saya akan menghindari penggunaan .lower () pada nama file jika tanpa alasan lain selain membuat kode Anda lebih mandiri. (linux adalah kasus sensistive, .lower () pada nama file pasti akan korup logika Anda akhirnya ... atau lebih buruk, file penting!)

Mengapa tidak menggunakan ulang ? (Meskipun untuk menjadi lebih kuat, Anda harus memeriksa header file ajaib dari setiap file ... Bagaimana memeriksa jenis file tanpa ekstensi dalam 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)) 

Keluaran:

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
Ini tidak akan berfungsi untuk file yang mengandung banyak ., misalnyasome.test.file.mp3
Nick

3
Anda bisa melakukan [-1] untuk menangkap casing tepi itu.
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'

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.