在 Python 中更改文件扩展名

Posted

技术标签:

【中文标题】在 Python 中更改文件扩展名【英文标题】:Changing file extension in Python 【发布时间】:2011-02-23 09:49:46 【问题描述】:

假设从index.py 使用CGI,我有发布文件foo.fasta 来显示文件。我想在显示文件中将foo.fasta 的文件扩展名更改为foo.aln。我该怎么做?

【问题讨论】:

这能回答你的问题吗? How to replace (or strip) an extension from a filename in Python? 【参考方案1】:

使用pathlib.Path的优雅方式:

from pathlib import Path
p = Path('mysequence.fasta')
p.rename(p.with_suffix('.aln'))

【讨论】:

虽然 OP 没有要求执行重命名,但它在标签中,如果您要执行重命名并且如果可能的话,输入可能有一个路径而不仅仅是一个文件名,这种技术是正确的。 关于.with_suffix(),属性.suffix.suffixes应该有setter。【参考方案2】:

os.path.splitext(), os.rename()

例如:

# renamee is the file getting renamed, pre is the part of file name before extension and ext is current extension
pre, ext = os.path.splitext(renamee)
os.rename(renamee, pre + new_extension)

【讨论】:

你能说得更具体点吗,我之前也看过文档,但是没有用。 使用第一个函数获取基数。将它与新扩展名结合起来,并将旧文件名和新文件名传递给第二个函数。 更正:os.rename(root, root + new_extension) 应改为 os.rename(renamee, root + new_extension) 其实,python3 最好用这个方法代替:pathlib.path(pathtofile).with_suffix(".mynewext")。使用 pathlib.path(pathtofile).stem 建议的方式有效,但会删除基本名称之前的路径。 str(pathlib.path(pathtofile).with_suffix(".mynewext"))【参考方案3】:
import os
thisFile = "mysequence.fasta"
base = os.path.splitext(thisFile)[0]
os.rename(thisFile, base + ".aln")

其中 thisFile = 您要更改的文件的绝对路径

【讨论】:

我更喜欢这个答案,因为它提供了一个示例,而不仅仅是引用完成任务所需的方法。谢谢@FryDay base, _ = os.path.splitext(thisFile) 更惯用。【参考方案4】:

从 Python 3.4 开始,有 pathlib 内置库。所以代码可能是这样的:

from pathlib import Path

filename = "mysequence.fasta"
new_filename = Path(filename).stem + ".aln"

https://docs.python.org/3.4/library/pathlib.html#pathlib.PurePath.stem

我喜欢 pathlib :)

【讨论】:

这更好用 python 3.6 字符串插值语法 (python.org/dev/peps/pep-0498) new_filename = f"Path(filename).stem.aln" ??? 小心 - 如果存在路径,stem 也会剥离路径。如果您想重命名文件并且提供了路径(诚然这不是问题),则此技术将失败。 还有,结果是字符串,不再是pathlib路径。 p.parent / (p.stem + '.aln') 会给你一个新的路径。 警告:Path(filename).stem 删除文件名的目录(前缀)部分。【参考方案5】:

使用这个:

os.path.splitext("name.fasta")[0]+".aln"

以下是上述的工作原理:

splitext 方法将名称与创建元组的扩展分开:

os.path.splitext("name.fasta")

创建的元组现在包含字符串“name”和“fasta”。 然后您只需要访问作为元组的第一个元素的字符串“name”:

os.path.splitext("name.fasta")[0]

然后您想为该名称添加一个新的扩展名:

os.path.splitext("name.fasta")[0]+".aln"

【讨论】:

【参考方案6】:

正如 AnaPana 提到的,pathlib 在 python 3.4 中更加新和更容易,并且有新的 with_suffix 方法可以轻松处理这个问题:

from pathlib import Path
new_filename = Path(mysequence.fasta).with_suffix('.aln')

【讨论】:

【参考方案7】:

使用 pathlib 并保留完整路径:

from pathlib import Path
p = Path('/User/my/path')
new_p = Path(p.parent.as_posix() + '/' + p.stem + '.aln')

【讨论】:

让它更简单一点new_p = Path(p.with_suffix('').as_posix() + '.aln')【参考方案8】:

遗憾的是,我遇到了一个文件名上有多个点的情况,splittext 不能很好地工作......我的解决方法:

file = r'C:\Docs\file.2020.1.1.xls'
ext = '.'+ os.path.realpath(file).split('.')[-1:][0]
filefinal = file.replace(ext,'')
filefinal = file + '.zip'
os.rename(file ,filefinal)

【讨论】:

【参考方案9】:
>> file = r'C:\Docs\file.2020.1.1.xls'
>> ext = '.'+ os.path.realpath(file).split('.')[-1:][0]
>> filefinal = file.replace(ext,'.zip')
>> os.rename(file ,filefinal) 

重复扩展的错误逻辑,示例:'C:\Docs\.xls_aaa.xls.xls'

【讨论】:

以上是关于在 Python 中更改文件扩展名的主要内容,如果未能解决你的问题,请参考以下文章

python 更改给定文件夹中所有文件的扩展名

python 更改给定文件夹中所有文件的扩展名

python 更改给定文件夹中所有文件的扩展名

python 更改给定文件夹中所有文件的扩展名

(保存对话框)如何在 Vista/Win7 中更改文件过滤器时自动更改文件扩展名?

使用 python 验证文件扩展名 [重复]