Làm thế nào tôi có thể kiểm tra phần mở rộng của một tập tin?


178

Tôi đang làm việc trên một chương trình nhất định nơi tôi cần làm những việc khác nhau tùy thuộc vào phần mở rộng của tệp. Tôi chỉ có thể sử dụng này?

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

sử dụng mô-đun python re (regex) để khớp
kefe Fuzhou

20
@kefe Fuzhou: Trời ơi, không phải vì những trận đấu đơn giản.
orlp

Câu trả lời:


382

Giả sử mlà một chuỗi, bạn có thể sử dụng endswith:

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

Không phân biệt chữ hoa chữ thường và để loại bỏ một chuỗi if-if tiềm năng lớn khác:

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

2
ext = m.rpartition ('.') [- 1]; if ext == sẽ hiệu quả hơn nhiều
núi lửa

1
@WilmusMurdoch tôi gần như không thấy bình luận của bạn, rất vui vì tôi đã làm.
Flaudre

@volcano tại sao không sử dụng .split('.')[-1]? Hoặc là sự hợp tác thực sự hiệu quả cao?
Scott Anderson

55

os.pathcung cấp nhiều chức năng để thao tác đường dẫn / tên tệp. ( tài liệu )

os.path.splitext lấy một đường dẫn và tách phần mở rộng tập tin từ cuối của nó.

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

Cung cấp:

/folder/soundfile.mp3 là một mp3!
thư mục1 / thư mục / soundfile.flac là một tập tin flac!

Phương pháp này bỏ qua các giai đoạn hàng đầu nên /.mp3không được coi là tệp mp3. Tuy nhiên, đây là cách một không gian hàng đầu nên được đối xử. Ví dụ: .gitignorekhông phải là định dạng tệp
kon psych

23

Sử dụng pathlibtừ Python3.4 trở đi.

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

1
Đây là giải pháp tốt nhất
có thể

17

Nhìn vào mô-đun fnmatch. Điều đó sẽ làm những gì bạn đang cố gắng làm.

import fnmatch
import os

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

7

một cách dễ dàng có thể là:

import os

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

os.path.splitext(file)sẽ trả về một tuple với hai giá trị (tên tệp không có phần mở rộng + chỉ phần mở rộng). Chỉ mục thứ hai ([1]) sẽ cung cấp cho bạn phần mở rộng. Điều thú vị là, bằng cách này, bạn cũng có thể truy cập tên tệp khá dễ dàng, nếu cần!


6

hoặc có lẽ:

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

4

Một chủ đề cũ, nhưng có thể giúp độc giả tương lai ...

Tôi sẽ tránh sử dụng .lower () trên tên tệp nếu không vì lý do nào khác ngoài việc làm cho mã của bạn độc lập hơn với nền tảng. (linux trường hợp nhạy cảm, .lower () trên tên tệp chắc chắn sẽ làm hỏng logic của bạn cuối cùng ... hoặc tệ hơn, một tệp quan trọng!)

Tại sao không sử dụng lại ? (Mặc dù để mạnh mẽ hơn nữa, bạn nên kiểm tra tiêu đề tệp ma thuật của mỗi tệp ... Làm cách nào để kiểm tra loại tệp không có phần mở rộng trong 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)) 

Đầu ra:

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
Điều này sẽ không hoạt động đối với các tệp chứa nhiều .s, ví dụsome.test.file.mp3
Nick

3
Bạn có thể làm [-1] để chụp trường hợp cạnh đó.
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'

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.