2017-06-30 4 views
3

Ich bin ein Anfänger in Python. Ich möchte die folgende Funktion verstehen, die die Erweiterung der Datei zurückgibt:die Funktion in Python, die Erweiterung einer Datei zurückgibt

def get_extn(filename): 
    return filename[filename.rfind('.'):][1:] 

Ich verstehe nicht, warum es Klammern in der rfind Funktion [], aber nicht() und warum ist: und [1 :] vor der Klammer. Ich schätze eine Erklärung.

+0

des Punkt abzustreifen. –

+2

argh, warum nicht 'return filename [filename.rfind ('.') + 1:]' anstatt zweimal zu schneiden und eine zusätzliche temporäre Zeichenfolge in den Prozess zu erstellen? Das klingt nach jemandem, der die Lösung zusammenhackt ... – Baldrickk

Antwort

2

Sie müssen mit dem Verständnis der Python-Syntax beginnen.

Eckige Klammern greifen auf Elemente in einem Array zu, und die Klammern dienen zum Aufrufen einer Funktion. rfind ist eine Funktion, für die Sie das Argument '.' eingeben, um den Punkt im Dateinamen zu finden. Die Klammern sollen die Elemente im Array abrufen - sowohl die Elemente im Dateinamen, also Dateiname [], und die Elemente aus dem Array.

Die Doppelpunkte,:, sind für Segmente innerhalb des Arrays. [:] bedeutet das gesamte Array, [1:] bedeutet Elemente nach dem ersten. Siehe: Explain slice notation

4

Was Sie hier sehen, ist eine Funktion, die zwei mal Slicing Syntax hat. Für Objekte, die Aufschneiden Syntax unterstützen, kann man schreiben:

object[f:t] 

mit f und t Indizes. Sie erhalten dann eine Teilsequenz, die mit f beginnt und mit t endet (t ist exklusiv). Wenn f oder t nicht angegeben sind, bedeutet das normalerweise, dass wir von Anfang an oder bis zum Ende schneiden.

Die Funktion in Ihrer Frage ist ein bisschen kryptisch, und ist eigentlich äquivalent zu:

def get_extn(filename): 
    f = filename.rfind('.') 
    filename = filename[f:] 
    return filename[1:] 

Also zuerst erhalten wir den Index des letzten Punktes, dann bauen wir einen Teil, die von f beginnt, und schließlich Wir konstruieren eine Teilzeichenkette aus dieser Teilzeichenkette, die bei Index 1 beginnt (wodurch das erste Zeichen entfernt wird, das eine ist).

1

Ich empfehle die Verwendung der os.path module, um mit Dateinamen und Pfaden umzugehen.

Beispiel:

import os.path 

for path in ('/tmp/file.txt', 'file.doc', 'file', 'file.a.b.c'): 
    basename, extension=os.path.splitext(path) 
    print("path: '{}', base: '{}' extension '{}'".format(path,basename,extension)) 

Drucke:

path: '/tmp/file.txt', base: '/tmp/file' extension '.txt' 
path: 'file.doc', base: 'file' extension '.doc' 
path: 'file', base: 'file' extension '' 
path: 'file.a.b.c', base: 'file.a.b' extension '.c' 
Verwandte Themen