Antworten:
Ja. Verwendung 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 Teilen von Zeichenfolgen os.path.splitext
wird korrekt behandelt /a/b.c/d
, dass keine Erweiterung statt Erweiterung vorhanden ist .c/d
, und es wird so behandelt .bashrc
, dass keine Erweiterung statt Erweiterung vorhanden ist .bashrc
:
>>> os.path.splitext('/a/b.c/d')
('/a/b.c/d', '')
>>> os.path.splitext('.bashrc')
('.bashrc', '')
endswith()
tragbarer und pythonischer?
.asd
ist das wirklich die Erweiterung !! Wenn Sie darüber nachdenken, foo.tar.gz
handelt es sich um eine gzip-komprimierte Datei ( .gz
), die zufällig eine TAR-Datei ( .tar
) ist. Aber es ist in erster Linie eine gzip-Datei . Ich würde nicht erwarten, dass es die doppelte Erweiterung überhaupt zurückgibt.
splittext
. Wenn sie nur irgendetwas tun würden, um den Bruch zwischen Teilen dieses Namens zu kennzeichnen, wäre es viel einfacher zu erkennen, dass es splitExt
oder ist split_ext
. Sicher kann ich nicht die einzige Person sein, die diesen Fehler gemacht hat?
os.path.splitext('somefile.ext')
=> ('somefile', '.ext')
. Geben Sie ein Beispiel für einen tatsächlichen Zähler an, ohne auf eine Bibliothek eines Drittanbieters zu verweisen.
import os.path
extension = os.path.splitext(filename)[1]
import os.path
statt warum from os import path
?
from os import path
der Name path
in Ihrem lokalen Bereich verwendet wird. Auch andere, die sich den Code ansehen, wissen möglicherweise nicht sofort, dass der Pfad der Pfad vom Betriebssystemmodul ist. Wo, als ob Sie es verwenden import os.path
, bleibt es im os
Namespace und wo immer Sie den Anruf tätigen, wissen die Leute sofort, dass es path()
vom os
Modul stammt.
_, extension = os.path.splitext(filename)
viel schöner.
if check_for_gzip and os.path.splitext(filename)[1] == '.gz':
Neu in Version 3.4.
import pathlib
print(pathlib.Path('yourPath.example').suffix) # '.example'
Ich bin überrascht, dass noch niemand erwähnt pathlib
hat, pathlib
IST großartig!
Wenn Sie alle Suffixe benötigen (z. B. wenn Sie ein haben .tar.gz
), .suffixes
wird eine Liste von ihnen zurückgegeben!
''.join(pathlib.Path('somedir/file.tar.gz').suffixes)
.suffixes[-2:]
um sicherzustellen, dass höchstens .tar.gz angezeigt wird.
Eine Option kann das Aufteilen vom 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
"my.file.name.js".split('.') => ['my','file','name','js]
['file', 'tar', 'gz']
mit 'file.tar.gz'.split('.')
vs ['file.tar', 'gz']
mit 'file.tar.gz'.rsplit('.', 1)
. Ja, könnte sein.
Alle oben genannten Lösungen funktionieren, aber unter Linux habe ich festgestellt, dass am Ende der Erweiterungszeichenfolge eine neue Zeile steht, die den Erfolg von Übereinstimmungen verhindert. Fügen Sie die strip()
Methode am Ende hinzu. Zum Beispiel:
import os.path
extension = os.path.splitext(filename)[1][1:].strip()
[1:]
in .splittext(filename)[1][1:]
) - danke im Voraus
splittext()
(anders als wenn Sie eine Zeichenfolge mit '.' Teilen) enthält das '.' Zeichen in der Erweiterung. Das zusätzliche [1:]
wird es los.
Mit splitext gibt es Probleme mit Dateien mit doppelter Erweiterung (zB file.tar.gz
, file.tar.bz2
, etc ..)
>>> fileName, fileExtension = os.path.splitext('/path/to/somefile.tar.gz')
>>> fileExtension
'.gz'
sollte aber sein: .tar.gz
Die möglichen Lösungen sind hier
gunzip somefile.tar.gz
Wie lautet der Ausgabedateiname?
Es ist zwar ein altes Thema, aber ich frage mich, warum es in diesem Fall keine Erwähnung einer sehr einfachen Python-API 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'
("string before the right-most occurrence of the separator", "the separator itself", "the rest of the string")
. Wenn kein Trennzeichen gefunden wird, lautet das zurückgegebene Tupel : ("", "", "the original string")
.
Ü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:
Als Funktion:
def get_extension(filename):
basename = os.path.basename(filename) # os independent
ext = '.'.join(basename.split('.')[1:])
return '.' + ext if ext else None
[-1]
dann.
Sie können ein split
auf einem verwenden filename
:
f_extns = filename.split(".")
print ("The extension of the file is : " + repr(f_extns[-1]))
Dies erfordert keine zusätzliche Bibliothek
filename='ext.tar.gz'
extension = filename[filename.rfind('.'):]
filename
zurückgegeben wird, wenn der Dateiname überhaupt keine hat .
. Dies liegt daran, dass rfind
zurückgegeben wird, -1
wenn die Zeichenfolge nicht gefunden wird.
Dies ist eine direkte Zeichenfolgendarstellungstechnik: Ich sehe viele erwähnte Lösungen, aber ich denke, die meisten betrachten Split. Split tut dies jedoch bei jedem Auftreten von "." . Was Sie lieber suchen, ist Partition.
string = "folder/to_path/filename.ext"
extension = string.rpartition(".")[-1]
Eine andere Lösung mit Rechtsaufteilung:
# 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])
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'
\.[0-9a-z]+$
wie in diesem Beitrag .
Ein echter Einzeiler, wenn Sie Regex mögen. Und es spielt keine Rolle, auch wenn Sie zusätzliche "." mitten drin
import re
file_ext = re.search(r"\.([^.]+)$", filename).group(1)
Das Ergebnis finden Sie hier : Klicken Sie hier
Dies ist die einfachste Methode , um sowohl Dateiname als auch Erweiterung in nur einer Zeile abzurufen .
fName, ext = 'C:/folder name/Flower.jpeg'.split('/')[-1].split('.')
>>> print(fName)
Flower
>>> print(ext)
jpeg
Im Gegensatz zu anderen Lösungen müssen Sie hierfür kein Paket importieren.
Zum Spaß ... sammle einfach die Erweiterungen in einem Diktat und verfolge sie alle in einem Ordner. Dann ziehen Sie einfach die gewünschten Erweiterungen.
import os
search = {}
for f in os.listdir(os.getcwd()):
fn, fe = os.path.splitext(f)
try:
search[fe].append(f)
except:
search[fe]=[f,]
extensions = ('.png','.jpg')
for ex in extensions:
found = search.get(ex,'')
if found:
print(found)
Versuche dies:
files = ['file.jpeg','file.tar.gz','file.png','file.foo.bar','file.etc']
pen_ext = ['foo', 'tar', 'bar', 'etc']
for file in files: #1
if (file.split(".")[-2] in pen_ext): #2
ext = file.split(".")[-2]+"."+file.split(".")[-1]#3
else:
ext = file.split(".")[-1] #4
print (ext) #5
foo.tar
ist ein gültiger Dateiname. Was passiert, wenn ich das auf deinen Code werfe? Was ist mit .bashrc
oder foo
? Dafür gibt es aus einem bestimmten Grund eine Bibliotheksfunktion ...
# try this, it works for anything, any length of extension
# e.g www.google.com/downloads/file1.gz.rs -> .gz.rs
import os.path
class LinkChecker:
@staticmethod
def get_link_extension(link: str)->str:
if link is None or link == "":
return ""
else:
paths = os.path.splitext(link)
ext = paths[1]
new_link = paths[0]
if ext != "":
return LinkChecker.get_link_extension(new_link) + ext
else:
return ""
def NewFileName(fichier):
cpt = 0
fic , *ext = fichier.split('.')
ext = '.'.join(ext)
while os.path.isfile(fichier):
cpt += 1
fichier = '{0}-({1}).{2}'.format(fic, cpt, ext)
return fichier
name_only=file_name[:filename.index(".")
Dadurch erhalten Sie den Dateinamen bis zum ersten ".", Was am häufigsten vorkommt.
file.name.ext
basename
ist hier ein wenig verwirrend, da zurückkehrenos.path.basename("/path/to/somefile.ext")
würde"somefile.ext"