簡體   English   中英

使用 python os.path 模塊分隔文件擴展名

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM