it-swarm.com.de

Erweiterung aus Dateiname in Python extrahieren

Gibt es eine Funktion, um die Erweiterung aus einem Dateinamen zu extrahieren?

1113
Alex

Ja. Verwenden Sie _os.path.splitext_ (siehe Python 2.X-Dokumentation oder Python 3.X-Dokumentation ):

_>>> 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 Versuchen zum Aufteilen von Zeichenfolgen behandelt _os.path.splitext_ korrekterweise _/a/b.c/d_ ohne Erweiterung anstelle von _.c/d_ und _.bashrc_ ohne Erweiterung anstelle von mit der Erweiterung _.bashrc_:

_>>> os.path.splitext('/a/b.c/d')
('/a/b.c/d', '')
>>> os.path.splitext('.bashrc')
('.bashrc', '')
_
1725
nosklo
import os.path
extension = os.path.splitext(filename)[1]
356
Brian Neal

Neu in Version 3.4.

import pathlib

print(pathlib.Path('yourPathGoesHere').suffix)

Ich bin überrascht, dass noch niemand von pathlib gesprochen hat, pathlib IS awesome!

Wenn Sie alle Suffixe benötigen (z. B. wenn Sie ein .tar.gz), .suffixes gibt eine Liste von ihnen zurück!

152
JeromeJ
import os.path
extension = os.path.splitext(filename)[1][1:]

Um nur den Text der Erweiterung ohne den Punkt zu erhalten.

98
wonzbak

Eine Option kann das Aufteilen von Punkt sein:

>>> filename = "example.jpeg"
>>> filename.split(".")[-1]
'jpeg'

Kein Fehler, wenn die Datei keine Erweiterung hat:

>>> "filename".split(".")[-1]
'filename'

Aber Sie müssen vorsichtig sein:

>>> "png".split(".")[-1]
'png'    # But file doesn't have an extension
65
Murat Çorlu

es lohnt sich, einen niedrigeren Wert hinzuzufügen, damit Sie sich nicht wundern, warum die JPGs nicht in Ihrer Liste angezeigt werden.

os.path.splitext(filename)[1][1:].strip().lower()
33
blented

Alle oben genannten Lösungen funktionieren, aber unter Linux habe ich festgestellt, dass am Ende der Erweiterungszeichenfolge eine neue Zeile steht, die verhindert, dass Übereinstimmungen erfolgreich sind. Fügen Sie am Ende die Methode strip() hinzu. Zum Beispiel:

import os.path
extension = os.path.splitext(filename)[1][1:].strip() 
15
yamex5

Bei Splitext treten Probleme mit Dateien mit doppelter Erweiterung auf (z. B. file.tar.gz, file.tar.bz2 usw.).

>>> fileName, fileExtension = os.path.splitext('/path/to/somefile.tar.gz')
>>> fileExtension 
'.gz'

aber sollte sein: .tar.gz

Die möglichen Lösungen sind hier

13
XavierCLL

Es ist zwar ein altes Thema, aber ich frage mich, warum es in diesem Fall keine sehr einfache API von python namens rpartition gibt:

um die Erweiterung eines bestimmten absoluten Dateipfads zu erhalten, können Sie einfach Folgendes eingeben:

filepath.rpartition('.')[-1]

beispiel:

path = '/home/jersey/remote/data/test.csv'
print path.rpartition('.')[-1]

wird dir geben: 'csv'

10
weiyixie

Überrascht wurde dies noch nicht erwähnt:

import os
fn = '/some/path/a.tar.gz'

basename = os.path.basename(fn)  # os independent
Out[] a.tar.gz

base = basename.split('.')[0]
Out[] a

ext = '.'.join(basename.split('.')[1:])   # <-- main part

# if you want a leading '.', and if no result `None`:
ext = '.' + ext if ext else None
Out[] .tar.gz

Leistungen:

  • Funktioniert wie erwartet für alles, was ich mir vorstellen kann
  • Keine Module
  • Kein Regex
  • Plattformübergreifend
  • Leicht erweiterbar (z. B. keine führenden Punkte für die Erweiterung, nur letzter Teil der Erweiterung)

Als funktion:

def get_extension(filename):
    basename = os.path.basename(filename)  # os independent
    ext = '.'.join(basename.split('.')[1:])
    return '.' + ext if ext else None
8
PascalVKooten

Sie finden einige großartige Dinge im pathlib-Modul.

import pathlib
x = pathlib.PurePosixPath("C:\\Path\\To\\File\\myfile.txt").suffix
print(x)

# Output 
'.txt'
8
r3t40
filename='ext.tar.gz'
extension = filename[filename.rfind('.'):]
8
staytime

Nur join all pathlib suffixes.

>>> x = 'file/path/archive.tar.gz'
>>> y = 'file/path/text.txt'
>>> ''.join(pathlib.Path(x).suffixes)
'.tar.gz'
>>> ''.join(pathlib.Path(y).suffixes)
'.txt'
6
Alex

Sie können split für filename verwenden:

f_extns = filename.split(".")
print ("The extension of the file is : " + repr(f_extns[-1]))

Dies erfordert keine zusätzliche Bibliothek

6
soheshdoshi

Hierbei handelt es sich um eine direkte Zeichenfolgendarstellung: Ich sehe viele der genannten Lösungen, aber ich denke, die meisten befassen sich mit Split. Split macht es jedoch bei jedem Auftreten von "." . Was Sie lieber suchen, ist Partition.

string = "folder/to_path/filename.ext"
extension = string.rpartition(".")[-1]
4
Kenstars

Auch diese Frage ist bereits beantwortet, ich würde die Lösung in Regex hinzufügen.

>>> import re
>>> file_suffix = ".*(\..*)"
>>> result = re.search(file_suffix, "somefile.ext")
>>> result.group(1)
'.ext'
3
Micha

Eine andere Lösung mit Rechtssplit:

# to get extension only

s = 'test.ext'

if '.' in s: ext = s.rsplit('.', 1)[1]

# or, to get file name and extension

def split_filepath(s):
    """
    get filename and extension from filepath 
    filepath -> (filename, extension)
    """
    if not '.' in s: return (s, '')
    r = s.rsplit('.', 1)
    return (r[0], r[1])