ฉันจะตรวจสอบนามสกุลไฟล์ได้อย่างไร?


178

ฉันกำลังทำงานกับโปรแกรมบางอย่างที่ฉันต้องทำสิ่งต่าง ๆ ขึ้นอยู่กับนามสกุลของไฟล์ ฉันจะใช้มันได้ไหม

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

โมดูลใช้หลามอีกครั้ง (regex) สำหรับการจับคู่
kefeizhou

21
@ kefeizhou: โอ้พระเจ้าไม่ได้สำหรับการแข่งขันที่เรียบง่าย
orlp

คำตอบ:


383

สมมติว่าmเป็นสตริงคุณสามารถใช้endswith:

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

ในการคำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่

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

2
ext = m.rpartition ('.') [- 1]; ถ้า ext ==จะมีประสิทธิภาพมากขึ้น
ภูเขาไฟ

1
@ WilhelmMurdoch ฉันเกือบไม่เห็นความคิดเห็นของคุณดีใจที่ฉันทำ
Flaudre

@ volcano ทำไมไม่ใช้.split('.')[-1]? หรือมีประสิทธิภาพสูงมาก
Scott Anderson

55

os.pathมีฟังก์ชั่นมากมายสำหรับการจัดการพา ธ / ชื่อไฟล์ ( เอกสาร )

os.path.splitext ใช้พา ธ และแยกนามสกุลไฟล์จากท้ายไฟล์

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

ให้:

/folder/soundfile.mp3 เป็น mp3!
folder1 / folder / soundfile.flac เป็นไฟล์ flac!

วิธีนี้ไม่สนใจช่วงเวลานำดังนั้นจึง/.mp3ไม่ถือว่าเป็นไฟล์ mp3 อย่างไรก็ตามนี่เป็นวิธีที่ควรปฏิบัติกับพื้นที่ชั้นนำ เช่น.gitignoreไม่ใช่รูปแบบไฟล์
kon psych

24

ใช้pathlibจาก Python3.4 เป็นต้นไป

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

1
นี่เป็นวิธีแก้ปัญหาที่ดีที่สุด
อาจ

17

ดูโมดูล fnmatch นั่นจะทำสิ่งที่คุณพยายามจะทำ

import fnmatch
import os

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

7

วิธีง่ายๆวิธีหนึ่งอาจเป็น:

import os

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

os.path.splitext(file)จะคืนค่า tuple ด้วยสองค่า (ชื่อไฟล์ที่ไม่มีส่วนขยาย + เพียงส่วนขยาย) ดัชนีที่สอง ([1]) จะให้ส่วนขยายแก่คุณ สิ่งที่ยอดเยี่ยมคือวิธีนี้คุณสามารถเข้าถึงชื่อไฟล์ได้อย่างง่ายดายหากต้องการ!


6

หรือบางที:

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

4

เธรดเก่า แต่อาจช่วยผู้อ่านในอนาคต ...

ฉันจะหลีกเลี่ยงการใช้. lower ()บนชื่อไฟล์หากไม่มีเหตุผลอื่นนอกจากจะทำให้โค้ดของคุณเป็นอิสระจากแพลตฟอร์มมากขึ้น (linux เป็นตัวพิมพ์เล็กและใหญ่ .lower ()ในชื่อไฟล์จะทำให้ตรรกะของคุณเสียหายในที่สุด ... หรือแย่กว่านั้นคือไฟล์สำคัญ!)

ทำไมไม่ใช้อีกครั้ง ? (แม้ว่าจะมีประสิทธิภาพมากกว่านี้คุณควรตรวจสอบส่วนหัวของไฟล์เวทย์มนตร์ของแต่ละไฟล์ ... วิธีตรวจสอบประเภทของไฟล์ที่ไม่มีนามสกุลในไพ ธ อน )

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

เอาท์พุท:

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
สิ่งนี้จะใช้งานไม่ได้กับไฟล์ที่มีหลายไฟล์.ตัวอย่างเช่นsome.test.file.mp3
Nick

3
คุณสามารถทำ [-1] เพื่อจับกรณีขอบนั้น
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'

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.