2010-08-23 55 views
47

Python中是否有內置函數可以替換(或刪除)文件擴展名(如果有的話)?如何從Python中的文件名替換(或剝離)擴展名?

例子:

print replace_extension('/home/user/somefile.txt', '.jpg') 

在我的例子:/home/user/somefile.txt將成爲/home/user/somefile.jpg

我不知道它的問題,但我需要這樣一個SCons的模塊,我寫。 (所以也許有一些SCONS的具體功能我可以使用?)

我想要的東西乾淨。做一個簡單的字符串替換字符串內的所有事件.txt顯然是不乾淨的。 (如果我的文件名是somefile.txt.txt.txt

+1

可能的重複[在Python中提取文件名中的擴展名](http://stackoverflow.com/questions/541390/extracting-extension-from-filename-in-python) – 2010-08-23 15:55:40

+0

SCons允許獲取操作字符串中的文件庫。你能發佈你的scons特定的邏輯嗎?這是行動,發射器,掃描儀? – bdbaddog 2015-11-01 03:00:49

回答

81

嘗試os.path.splitext它應該做你想做的。

import os 
print os.path.splitext('/home/user/somefile.txt')[0]+'.jpg' 
+2

@ereOn:另外,未來,請先嚐試搜索。它對於回答這些標準問題更有效。 – 2010-08-23 15:55:07

+3

@ S.Lott:相信我與否。但我做到了。我經常做。也許是錯誤的。 – ereOn 2010-08-23 16:05:57

+0

@ereOn:由於你的問題幾乎使用了完全相同的措詞,所以我有點驚訝,你沒有找到它。你的問題有5個字 - 連續 - 恰好匹配。 – 2010-08-23 16:09:02

19

正如@jethro說,splitext是整潔的方式做到這一點。但在這種情況下,它是很容易自己把它分解,由於延伸必須最後一期後傳來的文件名的一部分:

filename = '/home/user/somefile.txt' 
print(filename.rsplit(".", 1)[ 0 ]) 
# '/home/user/somefile' 

rsplit告訴Python來執行從起始字符串分割字符串的右側,並且1表示執行至多一次分割(以便例如'foo.bar.baz'[ 'foo.bar', 'baz' ])。由於rsplit將始終返回一個非空數組,因此我們可以安全地將0索引到其中以獲取文件名減去擴展名。

+0

感謝您的解釋和解決方法。 – ereOn 2010-08-23 15:00:31

+6

請注意,對於以點開頭且沒有其他擴展名的文件(如Linux上的隱藏文件,例如'.bashrc'),使用rsplit會導致不同的結果。 'os.path.splitext'爲這些返回一個空的擴展名,但是使用'rsplit'將把整個文件名作爲擴展名。 – 2012-01-24 11:11:52

+1

這也會給文件名'/ home/john.johnson/somefile'帶來意想不到的結果。 – 2016-11-13 10:26:06

3

另一種方法是使用str.rpartition(sep)方法。

例如:

filename = '/home/user/somefile.txt' 
(prefix, sep, suffix) = filename.rpartition('.') 

new_filename = prefix + '.jpg' 

print new_filename 
2

我更喜歡以下單行方法使用str.rsplit()

my_filename.rsplit('.', 1)[0] + '.jpg' 

實施例:

>>> my_filename = '/home/user/somefile.txt' 
>>> my_filename.rsplit('.', 1) 
>>> ['/home/user/somefile', 'txt'] 
+0

如果somefile沒有擴展名,並且用戶名是'john.doe',則失敗。 – 2017-05-18 09:05:28

0

對於Python> = 3.4:

from pathlib import Path 

filename = '/home/user/somefile.txt' 

p = Path(filename) 
new_filename = p.parent.joinpath(p.stem + '.jpg') # PosixPath('/home/user/somefile.jpg') 
new_filename_str = str(new_filename) # '/home/user/somefile.jpg' 
+0

我認爲JS提出的pathlib方法。簡單得多。 – h0b0 2017-08-17 09:47:17

13

擴展在觀息的回答,如何除去使用pathlib(Python的> = 3.4)的延伸:

from pathlib import Path 

filename = Path('/some/path/somefile.ext') 

filename_wo_ext = filename.with_suffix('') 

print(filename) 
print(filename_wo_ext) 

/some/path/somefile.ext
/一些/路徑/ somefile

+3

對於Python 3.x,這應該是答案pathlib是未來... – jlandercy 2017-03-29 09:10:05

相關問題