44 Stimmen

Vorteile von os.path.splitext gegenüber normalem .split?

Unter diese andere Frage zeigen die Stimmen eindeutig, dass die os.path.splitext Funktion wird der einfachen .split('.')[-1] String-Manipulation. Könnte mir jemand erklären, warum das so ist? Ist es schneller oder genauer oder was? Ich bin bereit zu akzeptieren, dass es etwas Besseres gibt, aber ich kann nicht sofort erkennen, was das sein könnte. Könnte es nicht übertrieben sein, ein ganzes Modul zu importieren, um dies zu tun, zumindest in einfachen Fällen?

EDIT: Die Spezifität des Betriebssystems ist ein großer Gewinn, der nicht sofort ersichtlich ist; aber selbst ich hätte den Fall "was, wenn es keinen Punkt gibt" erkennen müssen! Und vielen Dank an alle für die allgemeinen Kommentare zur Bibliotheksnutzung.

2voto

Jay Punkte 40418
  1. Das richtige Werkzeug für die richtige Aufgabe
  2. Bereits gründlich debuggt und als Teil der Python-Standardbibliothek getestet - keine Fehler, die durch Fehler in Ihrer selbst erstellten Version entstehen (z. B. was ist, wenn es keine Erweiterung gibt oder die Datei unter UNIX eine versteckte Datei wie '.bashrc' ist oder es mehrere Erweiterungen gibt?)
  3. Da die Funktion für diesen Zweck entwickelt wurde, verfügt sie über nützliche Rückgabewerte (basename, ext) für den übergebenen Dateinamen, was in bestimmten Fällen nützlicher sein kann als die manuelle Aufteilung des Pfades (auch hier könnten Grenzfälle ein Problem darstellen, wenn man den basename - ext herausfinden will)

Der einzige Grund, sich über den Import des Moduls Sorgen zu machen, ist die Sorge um den Overhead - das ist in den allermeisten Fällen wahrscheinlich kein Problem, und wenn es so eng ist, dann ist es wahrscheinlich, dass anderer Overhead in Python ein größeres Problem ist als das.

1voto

DevelopingChris Punkte 38437

Der erste und offensichtlichste Unterschied besteht darin, dass der geteilte Anruf keine Logik enthält, wenn keine Durchwahl vorhanden ist.

Dies kann auch durch eine Regex erreicht werden, damit sie sich wie ein 1-Liner ohne zusätzliche Includes verhält, aber trotzdem einen leeren String zurückgibt, wenn die Erweiterung nicht vorhanden ist.

Außerdem kann die Pfadbibliothek verschiedene Kontexte für Pfade mit unterschiedlichen Trennzeichen für Ordner verarbeiten.

0voto

chryss Punkte 7233

In dem Kommentar zu der Antwort, die diese Lösung liefert:

"Wenn die Datei keine Erweiterung hat, wird fälschlicherweise der Dateiname statt einer leeren Zeichenkette zurückgegeben."

Nicht jede Datei hat eine Erweiterung.

0voto

Kenan Banks Punkte 196831

Außerdem sind sie Standard und daher garantiert verfügbar, os.path.splitext :

Behandlung von Grenzfällen - wie die einer fehlenden Durchwahl.
Bietet Garantien - Neben der korrekten Rückgabe der Erweiterung, wenn eine solche existiert, garantiert sie, dass root + ext gibt immer den vollständigen Pfad zurück.
ist plattformübergreifend - im Python-Quelltext gibt es eigentlich drei verschiedene Versionen von os.path, und sie werden aufgerufen, je nachdem, welches Betriebssystem Python glaubt, dass man gerade benutzt.
Ist besser lesbar - Bedenken Sie, dass Ihre Version voraussetzt, dass die Benutzer wissen, dass Arrays mit negativen Zahlen indiziert werden können.

Im Übrigen sollte es nicht schneller gehen.

0voto

bialix Punkte 17460

1) einfaches split('.')[-1] funktioniert nicht korrekt für den Pfad als C:\foo.bar\Makefile Sie müssen also zuerst den Basisnamen mit os.path.basename() extrahieren, und selbst in diesem Fall wird es nicht gelingen, die Datei ohne Erweiterung korrekt aufzuteilen. os.path.splitext erledigt dies unter der Haube.

2) Trotz der Tatsache, dass os.path.splitext eine plattformübergreifende Lösung ist, ist sie nicht ideal. Betrachten wir die Spezialdateien mit führendem Punkt, z.B. .cvsignore, .bzrignore, .hgignore (sie sind in einigen VCS als Spezialdateien sehr beliebt). os.path.splitext gibt den gesamten Dateinamen als Erweiterung zurück, obwohl es für mich nicht richtig erscheint. Denn in diesem Fall ist der Name ohne Erweiterung ein leerer String. Obwohl dies das beabsichtigte Verhalten der Python-Standardbibliothek ist, ist es vielleicht nicht das, was der Benutzer tatsächlich will.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X