【问题标题】:Change the file extension for files in a folder?更改文件夹中文件的文件扩展名?
【发布时间】:2013-05-20 02:53:36
【问题描述】:

我想更改特定文件夹中文件的扩展名。我在论坛上读到了这个话题。使用确实的想法,我编写了以下代码,我希望它可以工作,但它没有。我将感谢任何指导以找到我的错误。

   import os,sys
   folder = 'E:/.../1936342-G/test'
   for filename in os.listdir(folder):
           infilename = os.path.join(folder,filename)
           if not os.path.isfile(infilename): continue
           oldbase = os.path.splitext(filename)
           infile= open(infilename, 'r')
           newname = infilename.replace('.grf', '.las')
           output = os.rename(infilename, newname)
           outfile = open(output,'w')

【问题讨论】:

  • 在什么情况下不起作用?文件只是没有被重命名吗?是否有任何错误消息?
  • 感谢您的回复。好吧,它停在 ' output = os.rename(infilename, newname)' 行中
  • 它会停止吗?没有任何输出?

标签: python file


【解决方案1】:

如果你有 python 3.4 或更高版本,你可以使用pathlib。如下。此示例用于将.txt 更改为.md

from pathlib import Path

path = Path('./dir')

for f in path.iterdir():
    if f.is_file() and f.suffix in ['.txt']:
        f.rename(f.with_suffix('.md'))

【讨论】:

    【解决方案2】:

    源文件上的open 是不必要的,因为os.rename 只需要源和目标路径即可完成工作。此外,os.rename 总是返回 None,因此在其返回值上调用 open 是没有意义的。

    import os
    import sys
    folder = 'E:/.../1936342-G/test'
    for filename in os.listdir(folder):
        infilename = os.path.join(folder,filename)
        if not os.path.isfile(infilename): continue
        oldbase = os.path.splitext(filename)
        newname = infilename.replace('.grf', '.las')
        output = os.rename(infilename, newname)
    

    我只是删除了两个open。检查这是否适合您。

    【讨论】:

    • 谢谢,按照你的建议,我改变了行的位置,它继续,但又会在 'outfile = open(output,'w')' 行上进行 sotck
    • @user2355306 os.rename 似乎没有返回文件路径。
    • 替换不正确,例如文件可以有名称 Smth.grform.grf,@elyase 答案更好
    • oldbase = os.path.splitext(filename)这行有什么用?
    • @chenaren @jTiKey 非常感谢您提供的代码。但是,例如,我的文件没有任何扩展名,我想为文件夹中的每个文件添加扩展名。在这种情况下,如果您有任何建议,我将非常高兴...我不确定这是否适用于我的情况:newname = infilename.replace('.grf', '.las')
    【解决方案3】:

    导入操作系统

    dir =("C:\\Users\\jmathpal\\Desktop\\Jupyter\\Arista")
    for i in os.listdir(dir):
        files = os.path.join(dir,i)
        split= os.path.splitext(files)
        if split[1]=='.txt':
           os.rename(files,split[0]+'.csv')
    

    【讨论】:

    • 感谢您的回答。请解释您提供的代码的作用以及与以前存在的答案相比它增加了什么。另外,请避免使用dir 作为变量名。我还建议考虑如下解包:root, ext = os.path.splitext(files).
    【解决方案4】:
    #!/usr/bin/env python
    
    '''
    Batch renames file's extension in a given directory
    '''
    
    import os
    import sys
    from os.path import join
    from os.path import splitext
    
    def main():
        try:
            work_dir, old_ext, new_ext = sys.argv[1:]
        except ValueError:
            sys.exit("Usage: {} directory old-ext new-ext".format(__file__))
    
        for filename in os.listdir(work_dir):
            if old_ext == splitext(filename)[1]:
                newfile = filename.replace(old_ext, new_ext)
                os.rename(join(work_dir, filename), join(work_dir, newfile))
    
    
    if __name__ == '__main__':
        main()
    

    【讨论】:

      【解决方案5】:

      你不需要打开文件来重命名它们,os.rename 只需要它们的路径。还可以考虑使用glob 模块:

      import glob, os
      
      for filename in glob.iglob(os.path.join(folder, '*.grf')):
          os.rename(filename, filename[:-4] + '.las')
      

      【讨论】:

      • 错了。它在文件的扩展中添加了两个点而不是一个点,最后一行必须更改为:os.rename(filename, filename[:-4] + '.las')
      • @DaniPaniz,对不起,你的建议和我在回答中写的有什么区别?
      • 我猜它在旧版本中是“-3”,有人把它改成了正确的
      • Great.@elyase 如何将其扩展到也有要重命名的文件的子目录?
      【解决方案6】:

      这样的事情会将执行目录中以 .txt 结尾的所有文件重命名为 .text

      import os, sys
      
      for filename in os.listdir(os.path.dirname(os.path.abspath(__file__))):
        base_file, ext = os.path.splitext(filename)
        if ext == ".txt":
          os.rename(filename, base_file + ".text")
      

      【讨论】:

      • 感谢您的指导。使用此代码,运行进程将在最后一行存储错误“系统找不到数据”是什么原因?
      猜你喜欢
      • 2021-07-22
      • 2012-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-12
      • 1970-01-01
      • 2013-02-25
      相关资源
      最近更新 更多