在Python中更改文件扩展名

Mys*_*des 55 python file-extension rename

假设从index.pyCGI,我有帖子文件foo.fasta显示文件.我想将foo.fasta文件扩展名更改为foo.aln显示文件.我该怎么做?

小智 62

import os
thisFile = "mysequence.fasta"
base = os.path.splitext(thisFile)[0]
os.rename(thisFile, base + ".aln")
Run Code Online (Sandbox Code Playgroud)

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

  • 我更喜欢这个答案,因为它提供了一个示例,而不只是引用完成任务所需的方法.谢谢@FryDay (5认同)
  • base,_ = os.path.splitext(thisFile)更惯用。 (2认同)

Nik*_*vin 50

使用pathlib.Path的优雅方式:

from pathlib import Path
p = Path('mysequence.fasta')
p.rename(p.with_suffix('.aln'))
Run Code Online (Sandbox Code Playgroud)

  • 关于`.with_suffix()`,属性`.suffix`和`.suffixes`应该有setter. (3认同)
  • 尽管 OP 没有要求执行重命名,但它在标签中,如果您要执行重命名,并且输入可能具有路径而不仅仅是文件名,则此技术是正确的. (2认同)

Ign*_*ams 39

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)
Run Code Online (Sandbox Code Playgroud)

  • 更正:`os.rename(root,root + new_extension)`应该读成`os.rename(renamee,root + new_extension)` (6认同)
  • 实际上,最好使用此方法代替python3:pathlib.path(pathtofile).with_suffix(".mynewext").使用pathlib.path(pathtofile).stem建议的方法有效但会删除基本名称之前的路径. (3认同)
  • str(pathlib.path(pathtofile).with_suffix(“。mynewext”)) (2认同)

Ana*_*ana 21

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

from pathlib import Path

filename = "mysequence.fasta"
new_filename = Path(filename).stem + ".aln"
Run Code Online (Sandbox Code Playgroud)

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

我喜欢pathlib :)

  • 小心 - 如果存在,茎也会剥离路径。如果您想重命名文件并且提供了路径(这当然不是问题),则此技术将失败。 (4认同)
  • 此外,结果是一个字符串,不再是pathlib路径.`p.parent /(p.stem +'.aln')`会给你一个新的路径. (3认同)
  • 警告: Path(filename).stem 删除文件名的目录(前缀)部分。 (3认同)
  • 使用python 3.6字符串插值语法(https://www.python.org/dev/peps/pep-0498/)`new_filename = f"{Path(filename).stem} .aln"` (2认同)

mul*_*rse 14

用这个:

os.path.splitext("name.fasta")[0]+".aln"
Run Code Online (Sandbox Code Playgroud)

以下是上述工作原理:

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

os.path.splitext("name.fasta")
Run Code Online (Sandbox Code Playgroud)

创建的元组现在包含字符串"name"和"fasta".然后你只需要访问字符串"name",它是元组的第一个元素:

os.path.splitext("name.fasta")[0]
Run Code Online (Sandbox Code Playgroud)

然后你想为这个名字添加一个新的扩展名:

os.path.splitext("name.fasta")[0]+".aln"
Run Code Online (Sandbox Code Playgroud)


小智 7

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

from pathlib import Path
new_filename = Path(mysequence.fasta).with_suffix('.aln')
Run Code Online (Sandbox Code Playgroud)