[英]Separating file extensions using python os.path module
我正在使用os.path.splitext()
在 python 中工作,並且好奇是否可以將文件名與具有多個“.”的擴展名分開? 例如使用拆分文本的“foobar.aux.xml”。 文件名不同於 [foobar, foobar.xml, foobar.aux.xml]。 有沒有更好的辦法?
與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']
你可以嘗試:
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
從函數的幫助:
擴展是從最后一個點到結尾的所有內容,忽略前導點。
所以答案是否定的,你不能用這個函數來做。
如果你想在最后拆分任意數量的擴展,你可以創建一個這樣的函數:
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')
import os
#Returns the file extension or empty string if none is found.
#The actual extension is the string after the last dot (if multiple).
def get_extension(filename):
result = ""
if "." in filename:
result = os.path.splitext(filename)[-1]
return result
正如我在評論中提到的,此問題已被確定為 Python 中的錯誤。 見https://bugs.python.org/issue34931
例如,庫 os.path.splitext("St. Thomas.txt") 將返回: ('St. Thomas', '.txt') 這是正確的。 但是 os.path.splitext("St. Thomas") 返回 ('St', '. Thomas')。 下面的函數將正確返回 ('St. Thomas', '')。 這是我們試圖避免的錯誤類型。 os.path.splitext() 也奇怪地將 ("....txt") 拆分為 ('....txt', '') 而我們的 safe_splitext() 將正確拆分為 ('...', ' 。文本')
對於原始問題,您只需將預期的雙擴展名添加到列表中即可。
因為我遇到的文件名可能在文件名中嵌入了句點(並且可能有也可能沒有擴展名),所以我不情願地介紹了下面的實現,它需要明確列出預期的擴展名。 在我們的例子中,我們主要知道我們正在使用哪些擴展。 如果沒有找到擴展名,它會嘗試找到一個未列出的擴展名並以這種方式拆分,然后發出一條消息以允許添加新的擴展名。
def safe_splitext(filepath):
""" the library os.path.splitext(path)
can be fooled by periods in the name.
This function is limited to the extensions we normally work with.
"""
match = re.search(r'(\.pbm|\.csv|\.jpeg|\.jpg|\.json|\.lst|\.odt|'
r'\.pdf|\.png|\.tif|\.txt|\.xlsx|\.zip|\.html|'
r'\.htm|\.md|\.sha|\.DVD|\.db|\.yml|\.yaml|\.lock)$',
filepath, flags=re.I)
if bool(match):
extension = match[1]
name = re.sub(fr'\{extension}$', '', filepath)
return name, extension
match = re.search(r'(\.[^\.]{1,4})$', filepath, flags=re.I)
if bool(match):
extension = match[1]
name = re.sub(fr'\{extension}$', '', filepath)
print(f"Warning: unusual extension: {extension}")
return name, extension
return filepath, ''
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.