Extrahieren der Erweiterung aus dem Dateinamen in Python

Lesezeit: 6 Minuten

Benutzer-Avatar
Alex

Gibt es eine Funktion, um die Erweiterung aus einem Dateinamen zu extrahieren?

Benutzer-Avatar
nosklo

Verwenden os.path.splitext:

>>> import os
>>> filename, file_extension = os.path.splitext('/path/to/somefile.ext')
>>> filename
'/path/to/somefile'
>>> file_extension
'.ext'

Im Gegensatz zu den meisten manuellen String-Splitting-Versuchen os.path.splitext wird richtig behandeln /a/b.c/d als keine Erweiterung zu haben, anstatt eine Erweiterung zu haben .c/dund es wird behandeln .bashrc als keine Erweiterung zu haben, anstatt eine Erweiterung zu haben .bashrc:

>>> os.path.splitext('/a/b.c/d')
('/a/b.c/d', '')
>>> os.path.splitext('.bashrc')
('.bashrc', '')

  • die Verwendung von basename ist hier etwas verwirrend da os.path.basename("/path/to/somefile.ext") würde zurückkehren "somefile.ext"

    – Jiaaro

    19. September 2011 um 21:35 Uhr


  • würde nicht endswith() nicht tragbarer und pythonischer sein?

    – Sebastian Mach

    28. August 2013 um 16:42 Uhr

  • @klingt.net Nun, in diesem Fall, .asd ist wirklich die Erweiterung!! Wenn du darüber nachdenkst, foo.tar.gz ist ein gzip-komprimierte Datei (.gz), was zufällig a ist tar-Datei (.tar). Aber es ist ein gzip-Datei auf dem ersten Platz. Ich würde nicht erwarten, dass es die doppelte Erweiterung überhaupt zurückgibt.

    – nosklo

    16. Januar 2014 um 20:18 Uhr

  • Die standardmäßige Benennungskonvention für Python-Funktionen ist wirklich ärgerlich – fast jedes Mal, wenn ich das nachschlage, verwechsele ich es damit splittext. Wenn sie nur irgendetwas tun würden, um den Bruch zwischen Teilen dieses Namens anzuzeigen, wäre es viel einfacher zu erkennen, dass es so ist splitExt oder split_ext. Ich kann doch nicht die einzige Person sein, die diesen Fehler gemacht hat?

    – ArtOfWarfare

    7. Januar 2015 um 23:27 Uhr


  • @Vingtoft Sie haben in Ihrem Kommentar nichts über den FileStorage von Werkzeug erwähnt, und diese Frage hat nichts mit diesem speziellen Szenario zu tun. Möglicherweise stimmt etwas nicht damit, wie Ihnen der Dateiname übergeben wird. os.path.splitext('somefile.ext') => ('somefile', '.ext'). Fühlen Sie sich frei, ein tatsächliches Gegenbeispiel bereitzustellen, ohne auf eine Bibliothek von Drittanbietern zu verweisen.

    – Gewthen

    2. März 2016 um 2:13 Uhr


Benutzer-Avatar
Jeromej

Neu in Version 3.4.

import pathlib

print(pathlib.Path('yourPath.example').suffix) # '.example'
print(pathlib.Path("hello/foo.bar.tar.gz").suffixes) # ['.bar', '.tar', '.gz']

Ich bin überrascht, dass niemand erwähnt hat pathlib noch, pathlib Ist großartig!

  • Beispiel für das Erhalten von .tar.gz: ''.join(pathlib.Path('somedir/file.tar.gz').suffixes)

    – teichert

    3. August 2017 um 18:15 Uhr

  • Gute Antwort. Ich fand dieses Tutorial nützlicher als die Dokumentation: zetcode.com/python/pathlib

    – Benutzer118967

    11. September 2019 um 2:38 Uhr

  • @ user3780389 Wäre ein “foo.bar.tar.gz” nicht immer noch ein gültiges “.tar.gz”? Wenn ja, sollte Ihr Snippet verwenden .suffixes[-2:] um sicherzustellen, dass höchstens .tar.gz erhalten wird.

    – Jeromej

    20. April 2020 um 7:25 Uhr


  • Es gibt immer noch Fälle, in denen dies nicht wie erwartet funktioniert "filename with.a dot inside.tar". Dies ist die Lösung, die ich derzeit verwende: "".join([s for s in pathlib.Path('somedir/file.tar.gz').suffixes if not " " in s])

    – eadmaster

    2. Januar 2021 um 19:09 Uhr


  • @BenLindsay stimmte zu. Ich finde pathlib sehr praktisch.

    – HerrVerma

    23. Mai um 13:47 Uhr

import os.path
extension = os.path.splitext(filename)[1]

  • Aus Neugier, warum import os.path Anstatt von from os import path?

    – Kiwa

    26. August 2011 um 12:40 Uhr

  • Oh, ich habe mich nur gefragt, ob es einen bestimmten Grund dafür gibt (außer Konvention). Ich lerne immer noch Python und wollte mehr lernen!

    – Kiwa

    26. August 2011 um 19:30 Uhr


  • es hängt wirklich davon ab, ob Sie verwenden from os import path dann der Name path in Ihrem lokalen Geltungsbereich aufgenommen wird, wissen auch andere, die sich den Code ansehen, möglicherweise nicht sofort, dass path der Pfad aus dem os-Modul ist. Wo als ob Sie verwenden import os.path es hält es innerhalb der os Namensraum und wo immer Sie den Anruf tätigen, wissen die Leute, wo es ist path() von dem os Modul sofort.

    – dennmat

    24. November 2011 um 18:45 Uhr


  • Ich weiß, es ist semantisch nicht anders, aber ich persönlich finde die Konstruktion _, extension = os.path.splitext(filename) viel schöner aussehen.

    – Tim Gilbert

    14. August 2014 um 3:37 Uhr

  • Wenn Sie die Erweiterung als Teil eines komplexeren Ausdrucks wünschen, wird die [1] vielleicht sinnvoller: if check_for_gzip and os.path.splitext(filename)[1] == '.gz':

    – gerardw

    20. Februar 2018 um 19:38 Uhr


Benutzer-Avatar
Wonzbak

import os.path
extension = os.path.splitext(filename)[1][1:]

Um nur den Text der Erweiterung zu erhalten, ohne den Punkt.

Benutzer-Avatar
Murat Corlu

Für einfache Anwendungsfälle kann eine Option von Punkt getrennt werden:

>>> filename = "example.jpeg"
>>> filename.split(".")[-1]
'jpeg'

Kein Fehler, wenn die Datei keine Erweiterung hat:

>>> "filename".split(".")[-1]
'filename'

Aber Sie müssen aufpassen:

>>> "png".split(".")[-1]
'png'    # But file doesn't have an extension

Funktioniert auch nicht mit versteckten Dateien in Unix-Systemen:

>>> ".bashrc".split(".")[-1]
'bashrc'    # But this is not an extension

Für den allgemeinen Gebrauch bevorzugen os.path.splitext

  • Dies würde stören, wenn Sie x.tar.gz hochladen

    – Kyrill

    11. Mai 2012 um 13:59 Uhr

  • Nicht wirklich. Die Erweiterung einer Datei namens „x.tar.gz“ ist „gz“, nicht „tar.gz“. os.path.splitext gibt auch “.os” als Erweiterung an.

    – Murat Corlu

    11. Mai 2012 um 20:21 Uhr

  • können wir verwenden [1] statt [-1]. Ich konnte es nicht verstehen [-1] mit Split

    – Benutzer765443

    21. August 2013 um 5:44 Uhr

  • [-1] um das letzte Element von Elementen zu erhalten, die durch einen Punkt geteilt wurden. Beispiel: "my.file.name.js".split('.') => ['my','file','name','js]

    – Murat Corlu

    21. August 2013 um 8:27 Uhr

  • @BenjaminR ah ok, du machst eine Optimierung der Ergebnisliste. ['file', 'tar', 'gz'] mit 'file.tar.gz'.split('.') vs ['file.tar', 'gz'] mit 'file.tar.gz'.rsplit('.', 1). ja, könnte sein.

    – Murat Corlu

    28. August 2017 um 8:44 Uhr


Benutzer-Avatar
vermischt

Es lohnt sich, dort ein niedrigeres hinzuzufügen, damit Sie sich nicht fragen, warum die JPGs nicht in Ihrer Liste angezeigt werden.

os.path.splitext(filename)[1][1:].strip().lower()

  • Dies würde stören, wenn Sie x.tar.gz hochladen

    – Kyrill

    11. Mai 2012 um 13:59 Uhr

  • Nicht wirklich. Die Erweiterung einer Datei namens „x.tar.gz“ ist „gz“, nicht „tar.gz“. os.path.splitext gibt auch “.os” als Erweiterung an.

    – Murat Corlu

    11. Mai 2012 um 20:21 Uhr

  • können wir verwenden [1] statt [-1]. Ich konnte es nicht verstehen [-1] mit Split

    – Benutzer765443

    21. August 2013 um 5:44 Uhr

  • [-1] um das letzte Element von Elementen zu erhalten, die durch einen Punkt geteilt wurden. Beispiel: "my.file.name.js".split('.') => ['my','file','name','js]

    – Murat Corlu

    21. August 2013 um 8:27 Uhr

  • @BenjaminR ah ok, du machst eine Optimierung der Ergebnisliste. ['file', 'tar', 'gz'] mit 'file.tar.gz'.split('.') vs ['file.tar', 'gz'] mit 'file.tar.gz'.rsplit('.', 1). ja, könnte sein.

    – Murat Corlu

    28. August 2017 um 8:44 Uhr


Benutzer-Avatar
Christian Specht

Jede der oben genannten Lösungen funktioniert, aber unter Linux habe ich festgestellt, dass sich am Ende der Erweiterungszeichenfolge ein Zeilenumbruch befindet, der verhindert, dass Übereinstimmungen erfolgreich sind. Ergänzen Sie die strip() Methode zu Ende. Zum Beispiel:

import os.path
extension = os.path.splitext(filename)[1][1:].strip() 

  • Könnten Sie bitte erläutern, gegen welches zusätzliche Verhalten der zweite Index/Slice schützt? (also die [1:] in .splittext(filename)[1][1:]) – Vielen Dank im Voraus

    – Samuel Harmer

    11. Oktober 2011 um 9:47 Uhr


  • Habe es selbst herausgefunden: splittext() (anders als wenn Sie eine Zeichenfolge mit ‘.’ teilen) enthält das ‘.’ Zeichen in der Erweiterung. Das zusätzliche [1:] wird es los.

    – Samuel Harmer

    11. Oktober 2011 um 9:55 Uhr

1158830cookie-checkExtrahieren der Erweiterung aus dem Dateinamen in Python

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy