Gibt es in Python eine integrierte Funktion, die die Erweiterung eines Dateinamens (falls vorhanden) ersetzt (oder entfernt)?
Beispiel:
print replace_extension('/home/user/somefile.txt', '.jpg')
In meinem Beispiel: /home/user/somefile.txt
würde werden/home/user/somefile.jpg
Ich weiß nicht, ob es wichtig ist, aber ich brauche dies für ein SCons-Modul, das ich schreibe. (Vielleicht gibt es einige SCons-spezifische Funktionen, die ich verwenden kann?)
Ich hätte gerne etwas Sauberes . Ein einfacher String-Austausch aller Vorkommen .txt
innerhalb des Strings ist offensichtlich nicht sauber. (Dies würde fehlschlagen, wenn mein Dateiname ist somefile.txt.txt.txt
)
Antworten:
Versuchen Sie os.path.splitext, es sollte tun, was Sie wollen.
quelle
print os.path.join(os.path.splitext('/home/user/somefile.txt')[0], '.jpg')
wird zurückkehren/home/user/somefile/.jpg
, was nicht wünschenswert ist.Erweitern Sie die Antwort von AnaPana, wie Sie eine Erweiterung mit pathlib entfernen (Python> = 3.4):
quelle
pth = Path('data/foo.tar.gz'); print(pth.with_suffix('.jpg'))
Wird zum Beispiel ausgegeben'data/foo.tar.jpg'
. Ich nehme an, Sie können dies tunpth.with_suffix('').with_suffix('.jpg')
, aber es ist umständlich, und Sie müssten eine beliebig lange Kette von.with_suffix('')
Aufrufen hinzufügen , um mit einer beliebigen Anzahl von Punkten.
in einer Dateierweiterung umgehen zu können (zugegebenermaßen ist mehr als 2 ein exotischer Randfall).while
Schleife verwenden, um das zu lösen:pth = Path('data/foo.tar.gz'); while pth != pth.with_suffix(''): pth = pth.with_suffix(''); pth = pth.with_suffix('.jpg')
Wie @jethro sagte,
splitext
ist der ordentliche Weg, es zu tun. In diesem Fall ist es jedoch ziemlich einfach, es selbst aufzuteilen, da die Erweiterung der Teil des Dateinamens sein muss, der nach dem letzten Zeitraum kommt:Das
rsplit
weist Python an, die Zeichenfolgensplits beginnend rechts von der Zeichenfolge1
durchzuführen , und das sagt, dass höchstens eine Teilung durchgeführt werden soll (z . B.'foo.bar.baz'
->[ 'foo.bar', 'baz' ]
). Darsplit
immer ein nicht leeres Array zurückgegeben wird, können wir sicher darin indizieren0
, um den Dateinamen abzüglich der Erweiterung zu erhalten.quelle
rsplit
zu unterschiedlichen Ergebnissen für Dateien führt, die mit einem Punkt beginnen und keine andere Erweiterung haben (wie z.bashrc
. B. versteckte Dateien unter Linux ).os.path.splitext
Gibt für diese eine leere Erweiterung zurück, bei Verwendungrsplit
wird jedoch der gesamte Dateiname als Erweiterung behandelt./home/john.johnson/somefile
Ich bevorzuge den folgenden Einzeiler -Ansatz mit str.rsplit () :
Beispiel:
quelle
Für Python> = 3.4:
quelle
Umgang mit mehreren Erweiterungen
Für den Fall, dass Sie mehrere Erweiterungen haben, verwendet dieser Einzeiler
pathlib
undstr.replace
funktioniert ein Vergnügen:Verlängerungen entfernen / entfernen
Erweiterungen ersetzen
Wenn Sie auch eine
pathlib
Objektausgabe wünschen , können Sie die Zeile natürlich einschließenPath()
Alles in eine Funktion einwickeln
quelle
with_suffix
anstelle vonreplace
nur.gz
anstelle von.tar.gz
Meine Antwort "allgemein" sein. Wenn Sie jedoch nur eine einzige Erweiterung erwarten,with_suffix
wäre dies eine sauberere Lösung.Eine andere Möglichkeit ist die Verwendung der
str.rpartition(sep)
Methode.Beispielsweise:
quelle