是否有从文件名中提取扩展名的功能?
答案 0 :(得分:1651)
是。使用os.path.splitext
(请参阅Python 2.X documentation或Python 3.X documentation):
>>> 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
正确地视为没有扩展名而不是扩展名.c/d
,并且会将.bashrc
视为没有扩展名而非扩展名.bashrc
:
>>> os.path.splitext('/a/b.c/d')
('/a/b.c/d', '')
>>> os.path.splitext('.bashrc')
('.bashrc', '')
答案 1 :(得分:349)
import os.path
extension = os.path.splitext(filename)[1]
答案 2 :(得分:136)
版本3.4中的新功能。
import pathlib
print(pathlib.Path('yourPathGoesHere').suffix)
我很惊讶没人提到pathlib
,pathlib
太棒了!
如果您需要所有后缀(例如,如果您有.tar.gz
),.suffixes
将返回它们的列表!
答案 3 :(得分:94)
import os.path
extension = os.path.splitext(filename)[1][1:]
仅获取扩展名的文本,不带点。
答案 4 :(得分:63)
一个选项可能是从点分割:
>>> filename = "example.jpeg"
>>> filename.split(".")[-1]
'jpeg'
当文件没有扩展名时没有错误:
>>> "filename".split(".")[-1]
'filename'
但你必须小心:
>>> "png".split(".")[-1]
'png' # But file doesn't have an extension
答案 5 :(得分:33)
值得在那里添加一个较低的,所以你不会发现自己想知道为什么JPG没有出现在你的列表中。
os.path.splitext(filename)[1][1:].strip().lower()
答案 6 :(得分:14)
上面的任何解决方案都有效,但是在linux上我发现扩展字符串末尾有一个换行符会阻止匹配成功。将strip()
方法添加到最后。例如:
import os.path
extension = os.path.splitext(filename)[1][1:].strip()
答案 7 :(得分:13)
使用splitext时,双扩展文件存在问题(例如file.tar.gz
,file.tar.bz2
等。)
>>> fileName, fileExtension = os.path.splitext('/path/to/somefile.tar.gz')
>>> fileExtension
'.gz'
但应该是:.tar.gz
可能的解决方案是here
答案 8 :(得分:10)
虽然这是一个古老的话题,但我想知道为什么在这种情况下没有提到一个叫做rpartition的非常简单的pyi api:
要获得给定文件绝对路径的扩展,只需键入:
即可filepath.rpartition('.')[-1]
示例:
path = '/home/jersey/remote/data/test.csv'
print path.rpartition('.')[-1]
会给你:' csv'
答案 9 :(得分:8)
filename='ext.tar.gz'
extension = filename[filename.rfind('.'):]
答案 10 :(得分:7)
您可以在pathlib模块中找到一些很棒的东西。
import pathlib
x = pathlib.PurePosixPath("C:\\Path\\To\\File\\myfile.txt").suffix
print(x)
# Output
'.txt'
答案 11 :(得分:6)
您可以在split
上使用filename
:
f_extns = filename.split(".")
print ("The extension of the file is : " + repr(f_extns[-1]))
这不需要额外的库
答案 12 :(得分:6)
join
全部pathlib suffixes
。
>>> x = 'file/path/archive.tar.gz'
>>> y = 'file/path/text.txt'
>>> ''.join(pathlib.Path(x).suffixes)
'.tar.gz'
>>> ''.join(pathlib.Path(y).suffixes)
'.txt'
答案 13 :(得分:4)
这是一种直接的字符串表示技术: 我看到很多提到的解决方案,但我认为大多数都在考虑拆分。 然而拆分在每次出现“。”时都会发生。 。 你宁愿寻找的是分区。
string = "folder/to_path/filename.ext"
extension = string.rpartition(".")[-1]
答案 14 :(得分:3)
右分裂的另一种解决方案:
# 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])
答案 15 :(得分:3)
即使这个问题已经回答,我也会在Regex中添加解决方案。
>>> import re
>>> file_suffix = ".*(\..*)"
>>> result = re.search(file_suffix, "somefile.ext")
>>> result.group(1)
'.ext'
答案 16 :(得分:2)
如果您喜欢正则表达式,则是真正的单线。 而且即使您有其他“。”也没关系。在中间
import re
file_ext = re.search(r"\.([^.]+)$", filename).group(1)
查看结果,这里:Click Here
答案 17 :(得分:1)
尝试一下:
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
答案 18 :(得分:0)
这是最简单的方法,仅需单行即可获取文件名和扩展名。
fName, ext = 'C:/folder name/Flower.jpeg'.split('/')[-1].split('.')
>>> print(fName)
Flower
>>> print(ext)
jpeg
与其他解决方案不同,您不需要为此导入任何软件包。
答案 19 :(得分:0)
对于趣味性...只需将扩展名收集到字典中,然后将所有扩展名跟踪到文件夹中即可。然后,只需拉出所需的扩展名即可。
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)
答案 20 :(得分:-1)
a = ".bashrc"
b = "text.txt"
extension_a = a.split(".")
extension_b = b.split(".")
print(extension_a[-1]) # bashrc
print(extension_b[-1]) # txt
答案 21 :(得分:-2)
def NewFileName(fichier):
cpt = 0
fic , *ext = fichier.split('.')
ext = '.'.join(ext)
while os.path.isfile(fichier):
cpt += 1
fichier = '{0}-({1}).{2}'.format(fic, cpt, ext)
return fichier
答案 22 :(得分:-3)
# 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 ""
答案 23 :(得分:-7)
name_only=file_name[:filename.index(".")
这将为您提供第一个“。”的文件名,这将是最常见的。