在Python中更改文件扩展名


77

假设从index.pyCGI开始,我已经将文件foo.fasta显示为文件。我想将foo.fasta的文件扩展名更改为foo.aln显示文件。我该怎么做?

Answers:


59

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)

您能具体一点吗,我之前也看过文档,但是没有用。
MysticCodes

使用第一个函数获取基数。将其与新扩展名结合,然后将旧文件名和新文件名传递给第二个函数。
伊格纳西奥·巴斯克斯

7
更正:os.rename(root, root + new_extension)应阅读os.rename(renamee, root + new_extension)
mloskot,2014年

5
实际上,最好使用此方法代替python3:pathlib.path(pathtofile).with_suffix(“。mynewext”)。与pathlib.path(pathtofile).stem一起建议的方法有效,但会删除基本名称之前的路径。
比尔·摩尔

3
str(pathlib.path(pathtofile).with_suffix(“。mynewext”))
比尔·摩尔

76
import os
thisFile = "mysequence.fasta"
base = os.path.splitext(thisFile)[0]
os.rename(thisFile, base + ".aln")

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


6
我更喜欢这个答案,因为它提供了一个示例,而不仅仅是引用完成任务所需的方法。感谢@FryDay
sadmicrowave

4
base, _ = os.path.splitext(thisFile)更习惯。
jpmc26

76

使用pathlib.Path的一种优雅方式:

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

2
尽管OP并没有要求执行重命名,但是它在标签中,并且如果您要执行重命名,并且如果输入可能包含路径而不只是文件名,那么此技术是正确的选择。
杰森·库姆斯

6
至于.with_suffix(),性质.suffix.suffixes应有setter方法。
Polv

24

从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 :)


3
使用python 3.6字符串插值语法(python.org/dev/peps/pep-0498) 甚至更好new_filename = f"{Path(filename).stem}.aln" -Ki
Kishan B,

3
小心-如果存在杆,杆也会剥离路径。如果您想重命名文件,并且提供了路径(请问这不是问题),此技术将失败。
杰森·库姆斯

6
同样,结果是字符串,不再是pathlib路径。 p.parent / (p.stem + '.aln')会给你一个新的路径。
eric.frederich

2
警告:Path(filename).stem删除文件名的目录(前缀)部分。
user1741137 19/12/4

17

用这个:

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"

5

就像AnaPana提到的那样,pathlib在python 3.4中更新,更容易,并且有一个新的with_suffix方法可以轻松解决此问题:

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

3

使用pathlib并保留完整路径:

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

2
使其变得简单一点new_p = Path(p.with_suffix('').as_posix() + '.aln')
Jiho Noh,

2

可悲的是,我遇到了文件名上有多个点的情况,splittext效果不佳...我的解决方法是:

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)

1
>> 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'

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.