在 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 = 您要更改的文件的绝对路径
【讨论】:
我更喜欢这个答案,因为它提供了一个示例,而不仅仅是引用完成任务所需的方法。谢谢@FryDaybase, _ = 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 中更改文件扩展名的主要内容,如果未能解决你的问题,请参考以下文章