2010-08-23 17 views
47

Gibt es eine eingebaute Funktion in Python, die die Erweiterung eines Dateinamens ersetzt (oder entfernt, was auch immer) (wenn es einen hat)?Wie ersetzt man eine Erweiterung von einem Dateinamen in Python?

Beispiel:

print replace_extension('/home/user/somefile.txt', '.jpg') 

In meinem Beispiel: /home/user/somefile.txt/home/user/somefile.jpg

werden würde, ich weiß nicht, ob es wichtig ist, aber ich brauche das für ein SCons Modul Ich schreibe. (Also vielleicht gibt es einige SCons spezifische Funktion, die ich verwenden kann?)

Ich möchte etwas sauber. Eine einfache String-Ersetzung aller Vorkommen von .txt innerhalb der Zeichenfolge ist offensichtlich nicht sauber. (Dies würde fehlschlagen, wenn mein Dateiname somefile.txt.txt.txt ist)

+1

mögliches Duplikat von [Extrahieren von Dateinamenserweiterung in Python] (http://stackoverflow.com/questions/541390/extracting-extension-from-filename-in-python) –

+0

SCONS ermöglicht das Abrufen der Dateibasis in einer Aktionszeichenfolge. Kannst du deine SCON-spezifische Logik posten, die das benötigt? Ist das für die Aktion, Emitter, Scanner? – bdbaddog

Antwort

81

Versuchen Sie os.path.splitext sollte es tun, was Sie wollen.

import os 
print os.path.splitext('/home/user/somefile.txt')[0]+'.jpg' 
+2

@ereOn: Versuchen Sie auch in Zukunft, zuerst SUCHEN.Es funktioniert viel besser, um diese Art von Standardfragen zu beantworten. –

+3

@ S.Lott: Glaub mir oder nicht. Hab ich doch. Mache ich immer. Vielleicht mit den falschen Bedingungen. – ereOn

+0

@ereOn: Da Ihre Frage fast die gleiche Formulierung verwendet, bin ich etwas überrascht, dass Sie es nicht gefunden haben. Deine Frage hat 5 Wörter - in einer Reihe - die genau passen. –

19

Wie @jethro sagte, ist splitext die nette Art und Weise, es zu tun. Aber in diesem Fall ist es ziemlich einfach, es selbst zu spalten, da die Erweiterung muss sein der Teil des Dateinamen nach der letzten Periode kommt:

filename = '/home/user/somefile.txt' 
print(filename.rsplit(".", 1)[ 0 ]) 
# '/home/user/somefile' 

Die rsplit Python erzählt die Zeichenfolge Splits von dem Start auszuführen rechts von der Zeichenkette, und die 1 sagt, höchstens eine Teilung durchzuführen (so dass zB 'foo.bar.baz' ->[ 'foo.bar', 'baz' ]). Da rsplit immer ein nicht leeres Array zurückgibt, können wir 0 sicher darin indizieren, um den Dateinamen minus der Erweiterung zu erhalten.

+0

Danke für die Erklärungen und für die Problemumgehung. – ereOn

+6

Beachten Sie, dass die Verwendung von 'rsplit' zu unterschiedlichen Ergebnissen für Dateien führt, die mit einem Punkt beginnen und keine andere Erweiterung haben (wie versteckte Dateien unter Linux, z. B.' .bashrc'). 'os.path.splitext' gibt eine leere Erweiterung für diese zurück, aber mit' rsplit' wird der gesamte Dateiname als Erweiterung behandelt. –

+1

Dies führt auch zu unerwarteten Ergebnissen für den Dateinamen '/ home/john.johnson/somefile' –

3

Eine andere Möglichkeit ist die str.rpartition(sep) Methode zu verwenden.

Zum Beispiel:

filename = '/home/user/somefile.txt' 
(prefix, sep, suffix) = filename.rpartition('.') 

new_filename = prefix + '.jpg' 

print new_filename 
2

Ich ziehe die folgende Einzeiler Ansatz str.rsplit():

my_filename.rsplit('.', 1)[0] + '.jpg' 

Beispiel:

>>> my_filename = '/home/user/somefile.txt' 
>>> my_filename.rsplit('.', 1) 
>>> ['/home/user/somefile', 'txt'] 
+0

Dies schlägt fehl, wenn das Suffix keine Erweiterung hat und der Benutzer 'john.doe' ist. –

0

Für Python> = 3.4:

from pathlib import Path 

filename = '/home/user/somefile.txt' 

p = Path(filename) 
new_filename = p.parent.joinpath(p.stem + '.jpg') # PosixPath('/home/user/somefile.jpg') 
new_filename_str = str(new_filename) # '/home/user/somefile.jpg' 
+0

Ich denke, der Pathlib-Ansatz von JS vorgeschlagen. ist viel einfacher. – h0b0

13

Erweiterung auf Anapana Antwort, wie man entfernen eine Erweiterung mit pathlib (Python> = 3.4):

from pathlib import Path 

filename = Path('/some/path/somefile.ext') 

filename_wo_ext = filename.with_suffix('') 

print(filename) 
print(filename_wo_ext) 

/some/path/somefile.ext
/some/path/somefile

+3

Für Python 3.x sollte dies die Antwort sein pathlib ist die Zukunft ... – jlandercy

Verwandte Themen