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
   ...
wkoomson
sumber
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'))
lafras
sumber
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!
Biji pohon ek
sumber
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'
Greg
sumber
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
John Gaines Jr.
sumber
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!

peningkatan
sumber
6

atau mungkin:

from glob import glob
...
for files in glob('path/*.mp3'): 
  do something
for files in glob('path/*.flac'): 
  do something else
phynfo
sumber
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
Dan F.
sumber
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
sumber
2
if (file.split(".")[1] == "mp3"):
    print "its mp3"
elif (file.split(".")[1] == "flac"):
    print "its flac"
else:
    print "not compat"
Christian Papathanasiou
sumber
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'
nprak
sumber
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
sumber
5
Jelaskan sesuatu tentang jawaban Anda akan membantu orang lain untuk memahami dengan mudah, lihat stackoverflow.com/help/how-to-answer
Angel F Syrus