【问题标题】:How to rename a file using Python如何使用 Python 重命名文件
【发布时间】:2011-01-30 06:40:40
【问题描述】:

我想将a.txt 更改为b.kml

【问题讨论】:

    标签: python file-rename


    【解决方案1】:

    使用os.rename:

    import os
    
    os.rename('a.txt', 'b.kml')
    

    【讨论】:

    • 需要注意的是,如果文件不在工作目录中,则需要完整路径。
    • 不是真的,在 3.7 ubuntu 上,使用相对路径对我有用
    • @toing_toing 当然可以,他可能只是意味着您应该知道当前目录,并指定相对于它的路径,或者只使用绝对路径(如C:/folder/file.txt on Windows 或/home/file.txt 在 Linux/MacOS 上)。
    • 值得注意的是,这将在类 Unix 系统上静默覆盖文件,但在 Windows 系统上会以OSError 失败。 os.path.exists 应该用于在重命名之前检查目标是否存在。这确实会产生“检查时间到使用时间”错误,但不太可能导致问题。 (我知道解决这个问题没有简单的方法 - 请参阅here
    • 如果用户真的想在任何操作系统上替换文件,应该使用os.replace
    【解决方案2】:

    文件可能在目录中,在这种情况下指定路径:

    import os
    old_file = os.path.join("directory", "a.txt")
    new_file = os.path.join("directory", "b.kml")
    os.rename(old_file, new_file)
    

    【讨论】:

      【解决方案3】:

      从 Python 3.4 开始,可以使用 pathlib 模块来解决这个问题。

      如果您碰巧使用的是旧版本,则可以使用找到的向后移植版本 here

      假设你不在要重命名的根路径(只是给它增加一点难度),并且必须提供完整路径,我们可以看看这个:

      some_path = 'a/b/c/the_file.extension'
      

      因此,您可以按照自己的方式创建一个 Path 对象:

      from pathlib import Path
      p = Path(some_path)
      

      只是为了提供一些关于我们现在拥有的这个对象的信息,我们可以从中提取一些东西。例如,如果出于某种原因我们想通过将文件名从the_file 修改为the_file_1 来重命名文件,那么我们可以获得文件名部分:

      name_without_extension = p.stem
      

      并且仍然握着扩展名:

      ext = p.suffix
      

      我们可以通过简单的字符串操作来进行修改:

      Python 3.6 及更高版本使用 f 字符串!

      new_file_name = f"{name_without_extension}_1"
      

      否则:

      new_file_name = "{}_{}".format(name_without_extension, 1)
      

      现在我们可以通过在我们创建的路径对象上调用rename 方法并附加ext 来完成我们想要的正确重命名结构:

      p.rename(Path(p.parent, new_file_name + ext))
      

      更简短地展示它的简单性:

      Python 3.6+:

      from pathlib import Path
      p = Path(some_path)
      p.rename(Path(p.parent, f"{p.stem}_1_{p.suffix}"))
      

      低于 Python 3.6 的版本改为使用字符串格式方法:

      from pathlib import Path
      p = Path(some_path)
      p.rename(Path(p.parent, "{}_{}_{}".format(p.stem, 1, p.suffix))
      

      【讨论】:

      • 你为什么要这样做而不是接受的答案?看起来要复杂得多
      • 好吧@rbennell,这个答案的大部分是解释。答案真的只是最后的三行。此外,接受的答案是明确地针对该名称更改做出的。此答案提供了一种方法来显示如何操作文件名以保留文件路径或名称中所需的部分。此外,pathlib 库是在 python 3.4 中引入的,因此在这里分享答案也为一个可靠的模块提供了曝光,以展示它的多功能性和用于更复杂要求的用途。
      • 谢谢@idjaw,你的评论很好地回答了我们初学者的一个基本问题,一个简单的你为什么这样做?。此外,令人耳目一新的是,在互联网上看到通常被认为是无知的非敌对方法。
      • @SasukeUchiha - {} 用于字符串格式,您可以阅读有关 here 的信息。最终,发生的事情是{} 被传递给format 方法的变量所取代。所以第一个{} 将保存name_without_extension 中的内容,第二个将保存第二个参数,即1
      • 使用 f-strings 可以进一步简化它。 from pathlib import Path p = Path(some_path) version = 1 p.rename(Path(p.parent, f"{p.stem}_{version}" + p.suffix))
      【解决方案4】:
      import shutil
      
      shutil.move('a.txt', 'b.kml')
      

      这将用于重命名或移动文件。

      【讨论】:

      • shutil.move 不是一个好的选择,因为它不是原子操作。例如,如果文件已打开,shutil.move 将创建一个带有new_name 的文件,但不会删除带有old_name 的文件,因此会留下两个文件。另一方面,os.rename 什么都不做,这是一个更好的选择。使用shutil.move,即使您发现了错误,您仍然需要担心检查和删除流氓文件。当存在更好的工具时不值得:os.rename
      【解决方案5】:

      os.rename(old, new)

      这可以在 Python 文档中找到:http://docs.python.org/library/os.html

      【讨论】:

        【解决方案6】:

        使用os.rename。但是您必须将两个文件的完整路径传递给函数。如果我的桌面上有一个文件a.txt,那么我会这样做,而且我也必须提供完整的重命名文件。

        os.rename('C:\\Users\\Desktop\\a.txt', 'C:\\Users\\Desktop\\b.kml')
        

        【讨论】:

        • “必须”不是真的。您始终可以将相对文件名替换为绝对文件名,反之亦然。通常让初学者感到困扰的是他们不了解相对文件名与当前工作目录的关系。
        【解决方案7】:

        从 Python 3.3 及更高版本开始,通常首选使用 os.replace 而不是 os.rename,因此如果目标文件已存在,则不会引发 FileExistsError

        assert os.path.isfile('old.txt')
        assert os.path.isfile('new.txt')
        
        os.rename('old.txt', 'new.txt')
        # Raises FileExistsError
        os.replace('old.txt', 'new.txt')
        # Does not raise exception
        
        assert not os.path.isfile('old.txt')
        assert os.path.isfile('new.txt')
        

        请参阅documentation

        【讨论】:

          【解决方案8】:
          import os
          
          # Set the path
          path = 'a\\b\\c'  
          # save current working directory
          saved_cwd = os.getcwd()
          # change your cwd to the directory which contains files
          os.chdir(path)
          os.rename('a.txt', 'b.klm')
          # moving back to the directory you were in 
          os.chdir(saved_cwd)
          

          【讨论】:

          • 小心这样做。你不能总是chdir() 到一个目录,例如当它是 UNC 时,在 Windows 下会发生什么?并且做chdir() 有副作用。我宁愿直接指定os.rename() 的必要路径,而不是chdir()ing。
          【解决方案9】:

          这里有一点需要注意,我们应该检查是否存在使用新文件名的文件。

          假设如果 b.kml 文件存在,那么用相同的文件名重命名其他文件会导致删除现有的 b.kml。

          import os
          
          if not os.path.exists('b.kml'):
              os.rename('a.txt','b.kml')
          

          【讨论】:

            【解决方案10】:

            使用 Pathlib 库的 Path.rename 代替 os.rename:

            import pathlib
            
            original_path = pathlib.Path('a.txt')
            new_path = original_path.rename('b.kml')
            

            【讨论】:

            • 为什么这样更好?
            • 如果您的所有路径都已经是 Pathlib 对象,则使用此方法会更容易。
            【解决方案11】:

            这是一个仅使用pathlib 而不接触os 的示例,它根据字符串replace 操作更改目录中所有文件的名称,而不使用字符串连接:

            from pathlib import Path
            
            path = Path('/talend/studio/plugins/org.talend.designer.components.bigdata_7.3.1.20200214_1052\components/tMongoDB44Connection')
            
            for p in path.glob("tMongoDBConnection*"):
                new_name = p.name.replace("tMongoDBConnection", "tMongoDB44Connection")
                new_name = p.parent/new_name
                p.rename(new_name)
            

            【讨论】:

              【解决方案12】:
              import shutil
              import os
              
              files = os.listdir("./pics/") 
              
              for key in range(0, len(files)):
                 print files[key]
                 shutil.move("./pics/" + files[key],"./pics/img" + str(key) + ".jpeg")
              

              应该这样做。蟒蛇3+

              【讨论】:

              • ... 或使用 enumerate 以获得更易读的版本:for key, fname in enumerate(files): ...
              【解决方案13】:

              如果您使用的是 Windows 并且想要重命名文件夹中的 1000 多个文件,则: 您可以使用以下代码。 (Python3)

              import os
              
              path = os.chdir(input("Enter the path of the Your Image Folder :  ")) #Here put the path of your folder where your images are stored
              
              image_name = input("Enter your Image name : ") #Here, enter the name you want your images to have
              
              i = 0
              
              for file in os.listdir(path):
              
                  new_file_name = image_name+"_" + str(i) + ".jpg" #here you can change the extention of your renmamed file.
                  os.rename(file,new_file_name)
              
                  i = i + 1
              
              input("Renamed all Images!!")
              

              【讨论】:

                【解决方案14】:

                os.chdir(r"D:\Folder1\Folder2")
                os.rename(src,dst)
                #src 和 dst 应该在 Folder2 内

                【讨论】:

                  【解决方案15】:
                  import os
                  import re
                  from pathlib import Path
                  
                  for f in os.listdir(training_data_dir2):
                    for file in os.listdir( training_data_dir2 + '/' + f):
                      oldfile= Path(training_data_dir2 + '/' + f + '/' + file)
                      newfile = Path(training_data_dir2 + '/' + f + '/' + file[49:])
                      p=oldfile
                      p.rename(newfile)
                  

                  【讨论】:

                  • 硬编码正斜杠作为路径分隔符并将旧式os.path 与现代pathlib 混合是相当不确定的。用pathlib 代替。
                  【解决方案16】:

                  您可以使用os.system调用终端来完成任务:

                  os.system('mv oldfile newfile')
                  

                  【讨论】:

                  • 是的,这仅适用于基于 unix 的机器,因为 mv 是用于移动/重命名文件的 unix 内置命令行程序。
                  • 当您可以从 python 以多平台方式执行时,为什么要调用终端并定义仅 UNIX 的命令?
                  猜你喜欢
                  • 2022-10-14
                  • 2017-10-06
                  • 1970-01-01
                  • 1970-01-01
                  • 2013-08-24
                  • 1970-01-01
                  • 2016-01-01
                  • 2014-10-10
                  相关资源
                  最近更新 更多