2011-05-08 85 views
11

我正在python中使用os.path.splitext(),好奇的是,如果可以使用多個「。」分隔文件名和擴展名?例如使用splitext的「foobar.aux.xml」。文件名因[foobar,foobar.xml,foobar.aux.xml]而異。有沒有更好的辦法?使用python os.path模塊分隔文件擴展名

+2

@Nick,不大。他想要處理多個擴展名的文件名。 – 2011-05-08 20:42:35

+0

'os.path.splitext()'將正確地將''foobar.aux.xml「'分成''foobar.aux」'和'「.xml」'。你想/需要別的東西嗎? – martineau 2011-05-08 21:39:04

回答

19

拆分與os.extsep

>>> import os 
>>> 'filename.ext1.ext2'.split(os.extsep) 
['filename', 'ext1', 'ext2'] 

如果你想第一點之後的一切:

>>> 'filename.ext1.ext2'.split(os.extsep, 1) 
['filename', 'ext1.ext2'] 

如果您使用的是有可能包含點的目錄路徑:

>>> def my_splitext(path): 
...  """splitext for paths with directories that may contain dots.""" 
...  li = [] 
...  path_without_extensions = os.path.join(os.path.dirname(path), os.path.basename(path).split(os.extsep)[0]) 
...  extensions = os.path.basename(path).split(os.extsep)[1:] 
...  li.append(path_without_extensions) 
...  # li.append(extensions) if you want extensions in another list inside the list that is returned. 
...  li.extend(extensions) 
...  return li 
... 
>>> my_splitext('/path.with/dots./filename.ext1.ext2') 
['/path.with/dots./filename', 'ext1', 'ext2'] 
+2

或'os.path.extsep',如果這很方便。 – 2011-05-08 20:48:01

+0

@Artur Gaspar:這是可行的,不知道確切的字符串?所以你可以分開目錄中的所有文件或通配符? – KennyC 2011-05-08 20:59:36

+0

@KennyC它應該適用於沒有完整路徑(僅文件名)的所有文件名。我添加到答案my_splitext函數應適用於所有路徑。如果你想要通配符,你應該使用'glob'模塊。 – 2011-05-08 21:13:59

5

,你可以嘗試使用:

names = pathname.split('.') 
filename = names[0] 
extensions = names[1:] 

,如果你想使用splitext,您可以使用類似:

import os 

path = 'filename.es.txt' 

while True: 
    path, ext = os.path.splitext(path) 
    if not ext: 
     print path 
     break 
    else: 
     print ext 

生產:

.txt 
.es 
filename 
2

從的幫助功能:

擴展名是從最後一個 點到結束的所有內容,忽略了前導點。

所以答案是否定的,你不能用這個函數來做。

1

如果你想在年底分裂出去的任何數量的擴展,你可以創建這樣的功能:

def splitext_recurse(p): 
    base, ext = os.path.splitext(p) 
    if ext == '': 
     return (base,) 
    else: 
     return splitext_recurse(base) + (ext,) 

,並使用它,像這樣:

>>> splitext_recurse("foobar.aux.xml") 
('foobar', '.aux', '.xml') 
+0

如果你只是想要一個長延伸,比如'('foobar','.aux.xml')',那麼這個過程大致相同。 – 2011-05-08 20:30:26