Wie kann ich die Erweiterung einer Datei überprüfen?

178

Ich arbeite an einem bestimmten Programm, bei dem ich je nach Dateierweiterung verschiedene Aufgaben ausführen muss. Könnte ich das einfach benutzen?

if m == *.mp3
   ...
elif m == *.flac
   ...
wkoomson
quelle
Verwenden Sie Python Re-Modul (Regex) für Matching
Kefeizhou
20
@kefeizhou: Oh Gott nein, nicht für einfache Spiele.
Orlp

Antworten:

382

Angenommen, es mhandelt sich um eine Zeichenfolge, können Sie Folgendes verwenden endswith:

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

Um die Groß- und Kleinschreibung nicht zu berücksichtigen und eine potenziell große else-if-Kette zu eliminieren:

m.lower().endswith(('.png', '.jpg', '.jpeg'))
Lafras
quelle
2
ext = m.rpartition ('.') [- 1]; wenn ext == wird viel effizienter sein
Vulkan
1
@ WilhelmMurdoch Ich habe Ihren Kommentar fast nicht gesehen, froh, dass ich das getan habe.
Flaudre
@ Volcano warum nicht verwenden .split('.')[-1]? Oder ist die Partitionierung wirklich hocheffizient?
Scott Anderson
55

os.pathbietet viele Funktionen zum Bearbeiten von Pfaden / Dateinamen. ( docs )

os.path.splitext nimmt einen Pfad und teilt die Dateierweiterung vom Ende auf.

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

Gibt:

/folder/soundfile.mp3 ist ein mp3!
folder1 / folder / soundfile.flac ist eine flac-Datei!
Eichel
quelle
Diese Methode ignoriert führende Punkte und wird daher /.mp3nicht als MP3-Datei betrachtet. Dies ist jedoch die Art und Weise, wie ein führender Raum behandelt werden sollte. ZB .gitignoreist kein Dateiformat
kon psych
23

Verwendung pathlibab Python3.4.

from pathlib import Path
Path('my_file.mp3').suffix == '.mp3'
Greg
quelle
1
Dies ist die beste Lösung
kann
17

Schauen Sie sich das Modul fnmatch an. Das wird tun, was Sie versuchen zu tun.

import fnmatch
import os

for file in os.listdir('.'):
    if fnmatch.fnmatch(file, '*.txt'):
        print file
John Gaines Jr.
quelle
7

Ein einfacher Weg könnte sein:

import os

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

os.path.splitext(file)gibt ein Tupel mit zwei Werten zurück (der Dateiname ohne Erweiterung + nur die Erweiterung). Der zweite Index ([1]) gibt Ihnen daher nur die Erweiterung. Das Coole ist, dass Sie auf diese Weise bei Bedarf auch ganz einfach auf den Dateinamen zugreifen können!

upgrd
quelle
6

oder vielleicht:

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

Ein alter Thread, kann aber zukünftigen Lesern helfen ...

Ich würde die Verwendung von .lower () für Dateinamen vermeiden , wenn es keinen anderen Grund gibt, als Ihren Code plattformunabhängiger zu machen. (Linux ist Fall Empfindlicher, .unterhalb () auf einem Dateinamen wird sicherlich korrupt Ihre Logik schließlich ... oder noch schlimmer, eine wichtige Datei!)

Warum nicht re verwenden ? (Um noch robuster zu sein, sollten Sie den Magic File Header jeder Datei überprüfen ... Wie kann man den Dateityp ohne Erweiterungen in Python überprüfen? )

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

Ausgabe:

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.
quelle
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
quelle
2
if (file.split(".")[1] == "mp3"):
    print "its mp3"
elif (file.split(".")[1] == "flac"):
    print "its flac"
else:
    print "not compat"
Christian Papathanasiou
quelle
3
Dies funktioniert nicht für Dateien, die mehrere .s enthalten, zum Beispielsome.test.file.mp3
Nick
3
Sie können [-1] ausführen, um diesen Randfall zu erfassen.
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
quelle