2017-06-30 54 views
3

我是Python中的初學者。我想明白下面的函數,它返回文件的擴展名:python中返回文件擴展名的函數

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

我不明白爲什麼有在RFIND函數[]而不是(),爲什麼括號有:與[1 :]在括號之前。我讚賞一個解釋。

+0

若要去除點。 –

+2

argh,爲什麼不''返回文件名[filename.rfind('。')+ 1:]'而不是切片兩次,並在過程中創建一個額外的臨時字符串?這讓一些黑客一起竊取解決方案... – Baldrickk

回答

2

您需要從理解Python語法開始。

方括號訪問數組中的元素,括號用於調用函數。 rfind是一個函數,爲此您輸入參數'。',以查找文件名中的句點。括號用於檢索數組中的元素 - 文件名中的元素,因此filename []和數組中的元素。

冒號,:,用於數組中的切片。 [:]表示整個數組,[1:]表示第一個之後的元素。請參閱:Explain slice notation

4

您在這裏看到的是一個函數,它有兩次切片語法。對於支持切片語法對象,一個可以寫:

object[f:t] 

ft指數。然後,您將獲得一個以f開頭並以t結尾的子序列(t是唯一的)。如果沒有提供ft,那通常意味着我們從開始或結束切片。

你的問題中的作用是有點cryptical,實際上等同於:

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

所以首先我們獲得最後點的指數,那麼我們構建了從f啓動子,最後我們從該索引1開始的子字符串構造一個子字符串(從而刪除第一個字符,即'.')。

1

我建議使用os.path module來處理文件名和路徑。

實施例:

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)) 

打印:

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'