Gibt es eine Funktion, um die Erweiterung aus einem Dateinamen zu extrahieren?
Extrahieren der Erweiterung aus dem Dateinamen in Python
Alex
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/d
und 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 daos.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 istsplitExt
odersplit_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
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 vonfrom 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 Namepath
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 verwendenimport os.path
es hält es innerhalb deros
Namensraum und wo immer Sie den Anruf tätigen, wissen die Leute, wo es istpath()
von demos
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
Wonzbak
import os.path
extension = os.path.splitext(filename)[1][1:]
Um nur den Text der Erweiterung zu erhalten, ohne den Punkt.
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
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
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