Answers:
是。使用os.path.splitext
(请参阅Python 2.X文档或Python 3.X文档):
>>> import os
>>> filename, file_extension = os.path.splitext('/path/to/somefile.ext')
>>> filename
'/path/to/somefile'
>>> file_extension
'.ext'
与大多数手动字符串拆分尝试不同,os.path.splitext
它将正确地/a/b.c/d
视为没有扩展而不是具有extension .c/d
,并且将被.bashrc
视为没有扩展而不是具有extension .bashrc
:
>>> os.path.splitext('/a/b.c/d')
('/a/b.c/d', '')
>>> os.path.splitext('.bashrc')
('.bashrc', '')
endswith()
更便携,更pythonic吗?
.asd
真的是扩展名!!如果您考虑一下,那foo.tar.gz
是一个gzip压缩文件(.gz
),它恰好是tar文件(.tar
)。但这是一个gzip文件。我不希望它返回双扩展名。
splittext
。如果他们愿意做任何事情来表明此名称各部分之间的分隔符,那么识别它为splitExt
或会容易得多split_ext
。当然我不能成为唯一犯过此错误的人吗?
os.path.splitext('somefile.ext')
=> ('somefile', '.ext')
。随意提供一个实际的反例,而无需引用某些第三方库。
import os.path
extension = os.path.splitext(filename)[1]
import os.path
代替from os import path
?
from os import path
该名称,则该名称path
将在您的本地范围内使用,查看代码的其他人可能不会立即知道该路径是来自os模块的路径。仿佛使用import os.path
它一样,它将保留在os
命名空间中,无论您在哪里调用,人们都会立即知道它path()
来自os
模块。
_, extension = os.path.splitext(filename)
看起来更好。
if check_for_gzip and os.path.splitext(filename)[1] == '.gz':
3.4版的新功能。
import pathlib
print(pathlib.Path('yourPath.example').suffix) # '.example'
令人惊讶的是,还没有人提到它pathlib
,pathlib
真是太棒了!
如果需要所有后缀(例如,如果有.tar.gz
),.suffixes
将返回它们的列表!
''.join(pathlib.Path('somedir/file.tar.gz').suffixes)
.suffixes[-2:]
应用于确保最多仅获取.tar.gz。
一种选择可能是与点分开:
>>> filename = "example.jpeg"
>>> filename.split(".")[-1]
'jpeg'
文件没有扩展名时没有错误:
>>> "filename".split(".")[-1]
'filename'
但您必须小心:
>>> "png".split(".")[-1]
'png' # But file doesn't have an extension
"my.file.name.js".split('.') => ['my','file','name','js]
['file', 'tar', 'gz']
与'file.tar.gz'.split('.')
vs ['file.tar', 'gz']
搭配'file.tar.gz'.rsplit('.', 1)
。是的,可能是。
随着splitext有与双扩展名的文件的问题(例如file.tar.gz
,file.tar.bz2
等..)
>>> fileName, fileExtension = os.path.splitext('/path/to/somefile.tar.gz')
>>> fileExtension
'.gz'
但应为: .tar.gz
可能的解决方案在这里
gunzip somefile.tar.gz
输出文件名是什么?
尽管这是一个古老的话题,但是我想知道为什么在这种情况下为什么没有提到一个叫做rpartition的非常简单的python api:
要获取给定文件绝对路径的扩展名,只需键入:
filepath.rpartition('.')[-1]
例:
path = '/home/jersey/remote/data/test.csv'
print path.rpartition('.')[-1]
会给你:'csv'
("string before the right-most occurrence of the separator", "the separator itself", "the rest of the string")
。如果未找到分隔符,则返回的元组将为:("", "", "the original string")
。
惊讶的是尚未提及:
import os
fn = '/some/path/a.tar.gz'
basename = os.path.basename(fn) # os independent
Out[] a.tar.gz
base = basename.split('.')[0]
Out[] a
ext = '.'.join(basename.split('.')[1:]) # <-- main part
# if you want a leading '.', and if no result `None`:
ext = '.' + ext if ext else None
Out[] .tar.gz
优点:
作为功能:
def get_extension(filename):
basename = os.path.basename(filename) # os independent
ext = '.'.join(basename.split('.')[1:])
return '.' + ext if ext else None
[-1]
。
您可以在split
上使用filename
:
f_extns = filename.split(".")
print ("The extension of the file is : " + repr(f_extns[-1]))
这不需要额外的库
filename='ext.tar.gz'
extension = filename[filename.rfind('.'):]
filename
如果文件名根本没有.
,则导致返回最后一个字符。这是因为如果找不到该字符串则rfind
返回-1
。
右拆分的另一种解决方案:
# to get extension only
s = 'test.ext'
if '.' in s: ext = s.rsplit('.', 1)[1]
# or, to get file name and extension
def split_filepath(s):
"""
get filename and extension from filepath
filepath -> (filename, extension)
"""
if not '.' in s: return (s, '')
r = s.rsplit('.', 1)
return (r[0], r[1])
这是在单行中同时获取文件名和扩展名的最简单方法。
fName, ext = 'C:/folder name/Flower.jpeg'.split('/')[-1].split('.')
>>> print(fName)
Flower
>>> print(ext)
jpeg
与其他解决方案不同,您不需要为此导入任何软件包。
对于趣味性...只需将扩展名收集到字典中,然后将所有扩展名跟踪到文件夹中即可。然后,只需拉出所需的扩展名即可。
import os
search = {}
for f in os.listdir(os.getcwd()):
fn, fe = os.path.splitext(f)
try:
search[fe].append(f)
except:
search[fe]=[f,]
extensions = ('.png','.jpg')
for ex in extensions:
found = search.get(ex,'')
if found:
print(found)
尝试这个:
files = ['file.jpeg','file.tar.gz','file.png','file.foo.bar','file.etc']
pen_ext = ['foo', 'tar', 'bar', 'etc']
for file in files: #1
if (file.split(".")[-2] in pen_ext): #2
ext = file.split(".")[-2]+"."+file.split(".")[-1]#3
else:
ext = file.split(".")[-1] #4
print (ext) #5
foo.tar
是有效的文件名。如果我将其扔给您的代码会怎样?怎么样.bashrc
还是foo
?为此,有一个库函数……
# try this, it works for anything, any length of extension
# e.g www.google.com/downloads/file1.gz.rs -> .gz.rs
import os.path
class LinkChecker:
@staticmethod
def get_link_extension(link: str)->str:
if link is None or link == "":
return ""
else:
paths = os.path.splitext(link)
ext = paths[1]
new_link = paths[0]
if ext != "":
return LinkChecker.get_link_extension(new_link) + ext
else:
return ""
name_only=file_name[:filename.index(".")
这将为您提供最常见的第一个“。”文件名。
file.name.ext
basename
这里有点混乱,因为os.path.basename("/path/to/somefile.ext")
它将返回"somefile.ext"