1724 Stimmen

Wie erhalte ich den Dateinamen ohne die Erweiterung aus einem Pfad in Python?

Wie erhalte ich den Dateinamen ohne die Erweiterung aus einem Pfad in Python?

"/path/to/some/file.txt"    "file"

95voto

jjisnow Punkte 1198

https://docs.python.org/3/library/os.path.html

In Python 3 pathlib "Das pathlib-Modul bietet High-Level-Pfadobjekte." also,

>>> from pathlib import Path

>>> p = Path("/a/b/c.txt")
>>> p.with_suffix('')
WindowsPath('/a/b/c')
>>> p.stem
'c'

12 Stimmen

Dies ist die beste Python 3 Lösung für den allgemeinen Fall des Entfernens der Erweiterung aus einem vollständigen Pfad. Mit stem wird auch der übergeordnete Pfad entfernt. Falls Sie eine doppelte Erweiterung erwarten (wie z.B. bla.tar.gz), können Sie sie sogar zweimal verwenden: p.with_suffix('').with_suffix('').

42voto

dlink Punkte 1309

@IceAdor verweist in einem Kommentar zur Lösung von @user2902201 auf rsplit. rsplit ist die einfachste Lösung, die mehrere Perioden unterstützt.

Hier ist es buchstabiert:

file = 'my.report.txt'
print file.rsplit('.', 1)[0]

mein.bericht

32voto

Os.path.splitext() wird nicht funktionieren, wenn die Erweiterung mehrere Punkte enthält.

Zum Beispiel: images.tar.gz

>>> import os
>>> file_path = '/home/dc/images.tar.gz'
>>> file_name = os.path.basename(file_path)
>>> print os.path.splitext(file_name)[0]
images.tar

Sie können einfach den Index des ersten Punktes im Basisnamen finden und dann den Basisnamen zerschneiden, um nur den Dateinamen ohne Erweiterung zu erhalten.

>>> import os
>>> file_path = '/home/dc/images.tar.gz'
>>> file_name = os.path.basename(file_path)
>>> index_of_dot = file_name.index('.')
>>> file_name_without_extension = file_name[:index_of_dot]
>>> print file_name_without_extension
images

1 Stimmen

Index_of_dot = dateiname.index('.') Dies wird nach der Ermittlung des Basisnamens der Datei durchgeführt, damit sie nicht an .env geteilt wird

2 Stimmen

Dies ist ein wichtiger Punkt, denn eine solche Reihe von Verlängerungen ist üblich. .tar.gz .tar.bz .tar.7z

3 Stimmen

Beachten Sie, dass 'haystack'.index('needle') löst eine ValueError-Ausnahme aus, wenn die Nadel (im obigen Fall der Punkt, . ) ist nicht im Heuhaufen zu finden. Es gibt auch Dateien ohne jegliche Erweiterung.

32voto

Wenn Sie den Pfad zur Datei beibehalten und nur die Erweiterung entfernen möchten

>>> file = '/root/dir/sub.exten/file.data.1.2.dat'
>>> print ('.').join(file.split('.')[:-1])
/root/dir/sub.exten/file.data.1.2

23 Stimmen

Wenn Sie die letzte Periode aufteilen wollen, verwenden Sie rsplit: '/root/dir/sub.exten/file.data.1.2.dat'.rsplit('.', 1)

28voto

spinup Punkte 4055

Zwei oder weniger Erweiterungen

Wie in den Kommentaren zu anderen Pathlib-Antworten erwähnt, kann es schwierig sein, mehrere Suffixe zu handhaben. Zwei oder weniger Suffixe sind nicht so schlecht zu handhaben mit .with_suffix('') y .stem .

from pathlib import Path

pth = Path('foo/bar/baz.baz/thefile.tar.gz')

fn = pth.with_suffix('').stem

print(fn)      # thefile

Beliebige Anzahl von Erweiterungen

Wenn es mehr als zwei Suffixe geben kann, können Sie eine Schleife verwenden, um den allgemeinen Fall zu behandeln, dass es 0, 1 oder viele Suffixe geben kann.

pth = Path('foo/bar/baz/thefile.tar.gz.bz.7zip')

pth.name       # 'thefile.tar.gz.bz.7zip'
pth.suffixes   # ['.tar', '.gz', '.bz', '.7zip']

also

fn = pth.name
for s in pth.suffixes:
    fn = fn.rsplit(s)[0]

print(fn)      # thefile

o

fnp = Path(pth.name)  
for _ in fnp.suffixes:
    fnp = fnp.with_suffix('')

print(fnp)     # thefile

Hier ist zu beachten, dass fnp ein Pfad ist, während fn ist eine Zeichenkette, die die bevorzugte Form der Schleife bestimmen kann.

Für den Fall, dass Sie die erste Durchwahl kennen

Könnte die Erweiterung zum Beispiel lauten .tar , .tar.gz , .tar.gz.bz usw.; Sie können einfach rsplit die bekannte Erweiterung und nehmen Sie das erste Element:

pth = Path('foo/bar/baz.baz/thefile.tar.gz')

fn = pth.name.rsplit('.tar')[0]

print(fn)      # thefile

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