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

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

【问题讨论】:

标签: python rename file-extension


【解决方案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'

        【讨论】:

          猜你喜欢
          • 2013-06-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-09-17
          • 2018-01-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多